在运行时更改Spring任务的预定时间?

时间:2014-07-10 15:25:36

标签: java spring scheduled-tasks quartz-scheduler scheduler

或者,如果失败,则从调度程序中删除任务并添加新任务。

我担心这是春天的一部分我或多或少100%无知,花一个下午阅读有关它的文章并没有详尽阐述。

基本上,我有一个包含三个计划任务的程序,一个每500毫秒运行一个,另外两个基于cron表达式运行。我的客户希望能够动态更改这些cron表达式。

我可以告诉这意味着我需要从应用程序上下文中取出cron表达式并将它们移动到数据库中。那部分很容易。困难的部分是弄清楚如何在Spring中引用已存在的计划任务,并在下一次运行时进行更改。我在这个主题上发现的每篇文章都描述了如何设置应用程序上下文或注释。

我能找到的唯一答案是only work for regular intervals(并且根据评论,可能实际上不起作用)。我希望不必写一些解释Cron表达的东西,所以我考虑解决方案"计划B"。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您应该能够使用Quartz调度程序API来操作作业及其触发器。

在Spring的applicationContext中,你很可能有一个调度程序bean(org.springframework.scheduling.quartz.SchedulerFactoryBean),在你的应用程序中,你可以调用这个bean上的各种方法:

  • 获取所有工作的列表(请参阅getJobGroupNames + getJobKeys + getJobDetail方法)
  • 获取所有触发器的列表(请参阅getTriggerGroupNames + getTriggerKeys + getTrigger方法)
  • 获取特定作业的触发器列表(请参阅getTriggersOfJob方法)
  • 更新触发器定义(请参阅rescheduleJob方法)

有关API的详细信息,请参阅http://quartz-scheduler.org/api/2.2.0/。目前尚不清楚您使用的Quartz调度程序版本,但其他版本的API并没有太大的不同。

您也可以考虑使用外部Quartz调度程序GUI,它允许您更多地执行此操作,并且您不必将此逻辑编码到应用程序中。你可能想检查一下QuartzDesk(我是原作者,所以我在这里有点偏颇),或其他类似的产品(只是google的“quartz scheduler gui”)。