public void forceUpdatePodcast(Integer id) {
   log.info("Lancement de l'update forcé");
   Podcast podcast = podcastBusiness.findOne(id);
   podcast.setSignature("");
   podcast = podcastBusiness.save(podcast);
   updatePodcast(podcast.getId());
 }
  @Transactional(noRollbackFor = Exception.class)
  private void updatePodcast(List<Podcast> podcasts, Executor selectedExecutor) {
    initUpdate();

    log.info("Lancement de l'update");
    log.info("Traitement de {} podcasts", podcasts.size());

    podcasts
        // Launch every update
        .stream()
        .map(
            podcast ->
                supplyAsync(() -> workerService.updaterOf(podcast))
                    .thenApplyAsync(updater -> updater.update(podcast), selectedExecutor))
        .collect(
            toSet()) // Terminal operation forcing evaluation of each element upper in the stream
        // Get result of each update
        .stream()
        .map(this::wait)
        .filter(tuple -> tuple != Updater.NO_MODIFICATION_TUPLE)
        .peek((tuple) -> changeAndCommunicateUpdate(Boolean.TRUE))
        .forEach(
            tuple ->
                podcastBusiness.save(
                    attachNewItemsToPodcast(tuple.first(), tuple.middle(), tuple.last())));

    log.info("Fin du traitement des {} podcasts", podcasts.size());
    finishUpdate();
  }
 public void updatePodcast(Integer id) {
   updatePodcast(Collections.singletonList(podcastBusiness.findOne(id)), manualExecutor);
 }
 public void updatePodcast() {
   updatePodcast(podcastBusiness.findByUrlIsNotNull(), updateExecutor);
 }