Java остановить запланированное задание, если оно занимает больше определенного времени - PullRequest
0 голосов
/ 02 января 2019

У меня запланированное задание, которое выполняется каждые 100 секунд.Иногда выполнение этого метода занимает много времени (что нормально, и с этим нет проблем).В этой ситуации результат метода выполнения не важен для меня, и я хочу перепланировать задание на следующие 100 секунд.

Каков наилучший способ принудительно завершить выполнение задания (return) по прошествии определенного времени?

Мой запланированный код выглядит следующим образом:

@Scheduled(fixedDelay = 100*1000)
fun calculateLastDaysStatistics() {
    logger.info("affiliate statistics thread Started Successfully")
    val processStartDate = Date()

    for (i in 1..prevDaysToConsider) {
        logger.info("AdZone-Stats prev days $i")

        val yesterday = DateUtility.addDay(Date(), -i)

        val startDate = DateUtility.getZeroDayTime(yesterday.time)
        val endDate = DateUtility.addDay(startDate, 1)

        /* This method is probable to take a lot of time */
        calculateStatistics(startDate, endDate)
    }

    val processLength = (Date().time - processStartDate.time) / 1000
    logger.info("affiliate statistics thread finished in " + processLength + "s")
}

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы можете реализовать пользовательский планировщик заданий, используя org.springframework.scheduling.TaskScheduler вместо метода, основанного на аннотациях.

private final TaskScheduler scheduler;

@Autowired
public SchedulingManager(TaskScheduler scheduler) {
    this.scheduler = scheduler;
}

В этом случае

ScheduledFuture scheduledeFuture =  scheduler.schedule(()->{
  ....You job goes here..

}, new CronTrigger("*/100 * * * * *"));

Вы можете следить за запланированным будущим, чтобы быть уверенным, что оно запускает максимальное запланированное время.

scheduledeFuture.get(100,TimeUnit.SECONDS)
0 голосов
/ 02 января 2019

Попробуйте использовать фиксированную скорость вместо фиксированной задержки

Вот статья из Paraschiv.E. @ Запланированная аннотация весной. По рекомендации https://www.baeldung.com/spring-scheduled-tasks


  1. Планирование задачи с фиксированной скоростью

    @ Запланировано (fixedRate = 1000) public void scheduleFixedRateTask () { System.out.println ( «Задача с фиксированной ставкой -» + System.currentTimeMillis () / 1000); }

Обратите внимание, что начало выполнения задачи не ожидает завершения предыдущего выполнения .

Эта опция должна использоваться, когда каждое выполнение задачи является независимым.

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