Как запустить больше исполнений тех же заданий @Scheduled параллельно? - PullRequest
4 голосов
/ 24 октября 2019

У меня есть такая реализация, которая не работает. Как видите, задание занимает ~ 5 с и должно выполняться на fixedRate 1 с. Это означает, что должно быть ~ 5 заданий, работающих параллельно, но Spring ожидает завершения задания, прежде чем запускает другое ... Если я добавлю второе задание @Scheduled 'schedule2' с теми же параметрами и параметрами, у меня будет 2 разных задания, работающих параллельно, но никогдата же работа. Можно ли как-то этого добиться?

@Scheduled(fixedRate = 1000)
private void schedule1() {
    int index = atomicInteger1.addAndGet(1); 
    logger.info("Run Schedule1 nr.{} started at: {}", index, LocalDateTime.now());
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        logger.info("Schedule1 nr.{} finished at: {}", index, LocalDateTime.now());
    }
}

@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
    return Executors.newScheduledThreadPool(10);
}

Ответы [ 2 ]

3 голосов
/ 24 октября 2019

В этом случае каждое запланированное задание никогда не будет выполняться параллельно. Это потому, что задача занимает дольше , чем заданная fixedRate. Почему? Поскольку вызывается ScheduledExecutorService#scheduleAtFixedRate и, как сказано в документации (жирным шрифтом является мой):

... Если любое выполнение этой задачи занимает больше времени, чем ее период, то последующеевыполнение может начаться поздно, но не будет одновременно выполнять .

Один из способов решения этой проблемы - использование @Async и @EnableAsync. Многие примеры доступны в Spring docs :

@EnableAsync
public class Example {

  @Async
  @Scheduled(fixedRate = 1000)
  public void schedule1() throws InterruptedException {
    Thread.sleep(5000);
  }
}
0 голосов
/ 24 октября 2019

Если вы действительно хотите достичь того, чего хотите, вы должны сами управлять потоками, вызывая службу из задания в отдельном потоке ... но я не вижу причин, чтобы сделать это, по крайней мере, вы 'только тестирую и играю с Джобсом дома для домашних проектов.

В любом случае, посмотрите на это: https://www.baeldung.com/java-future

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...