【问题标题】:Java Spring CronTrigger Start ImmediatelyJava Spring CronTrigger 立即启动
【发布时间】:2019-07-29 22:37:59
【问题描述】:

我在 Spring 中使用 CronTrigger 来安排每隔一小时执行一些任务。第一次调度发生在一小时后。而我希望第一次调度立即发生。

@Autowired
@Qualifier("myScheduler")
private ThreadPoolTaskScheduler scheduler;

@Autowired @Lazy
private ScheduledService scheduledService; // implements Runnable

    Trigger trigger = new CronTrigger("0 0 * * * *");       
    Date date = trigger.nextExecutionTime(new SimpleTriggerContext());
    log.info("Next scheduled time for tasks - [" + date.toString() + "]");      
    scheduler.schedule(scheduledService, trigger);

如何立即触发第一次执行而不是等待一个小时?随后的触发器应每隔一小时工作一次。

【问题讨论】:

  • 这个answer怎么样?
  • 至于您的示例代码 - crontrigger 将使用给定上下文中的“LastCompletionTime”来计算下一个触发时间。如果没有给出那个时间,就像你的情况一样,那么最后完成时间默认为“现在”,并且“下一个”时间将在“最后完成时间”之后至少一秒开始,所以在“现在”之后。这就是你得到你所得到的。
  • @M.Prokhorov 你能提供示例代码吗?
  • 我不会提供任何示例代码,除非您指的是 Spring 的代码。那是在他们的 GitHub 页面上。
  • @M.Prokhorov hrat 答案代码使用一个常量值,但我必须使用 db 中的表达式,这可以通过 cronJob 但在启动时遇到问题。

标签: java spring cron


【解决方案1】:

在启动时,您可以在不使用调度程序的情况下调用任务。之后,您可以将执行留给调度程序。

例如:

@Scheduled(cron = "0 0 * * * *")
public void scheduleTaskUsingCronExpression() {
  // do something
}

但是在同一个类中,您可以在启动时运行它:

@EventListener(ApplicationReadyEvent.class)
public void onStartUp() {
  scheduleTaskUsingCronExpression();
}

【讨论】:

  • 如何将上下文传递给任务?
  • 上下文是什么?只需将任务重构为具有所需所有依赖项的类/方法
猜你喜欢
  • 2017-09-04
  • 2016-09-19
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2017-01-14
  • 2016-06-05
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多