在运行时更改Spring任务的计划时间?
或者,如果失败,则从调度程序中删除任务并添加一个新任务。在运行时更改Spring任务的计划时间?
恐怕这是春天的一部分我对100多%或100%的无知,花了一个下午阅读有关它的文章没有阐明很多东西。
基本上,我有一个程序有三个计划任务,一个每运行500毫秒,两个基于cron表达式运行。我的客户希望能够即时更改这些cron表达式。
附近,我可以说这意味着我需要从应用程序上下文中取出cron表达式并将它们移动到数据库。这部分很容易。最难的部分是弄清楚如何在Spring中获得对已经存在的计划任务的引用,并在下一次应该运行时进行更改。关于此主题的每篇文章都只描述了如何设置应用程序上下文或注释。
我一直能找到的唯一答案是only work for regular intervals(根据评论,这可能实际上并不工作)。我希望不必写一些解释Cron表达式的东西,所以我正在考虑这个解决方案“B计划”。
感谢您的帮助!
您应该可以使用Quartz scheduler API来操作作业及其触发器。
在你的Spring的ApplicationContext你最有可能有一个调度豆(org.springframework.scheduling.quartz.SchedulerFactoryBean),并在你的应用程序,你可以调用这个bean各种方法:
- 获取列表所有的工作(见getJobGroupNames + getJobKeys + getJobDetail方法)
- 获取所有触发器的列表(见getTriggerGroupNames + getTriggerKeys + getTrigger方法)
- 获取某项工作的触发器的列表(见getTriggersOfJob法)
- 更新触发器定义(见rescheduleJob法)
- 等
请参考http://quartz-scheduler.org/api/2.2.0/对API的细节。目前尚不清楚您使用的是Quartz调度器版本,但其他版本的API并没有太大差异。
您也可以考虑使用外部Quartz调度器GUI,它允许您更多地执行此操作,而不必将此逻辑编码到应用程序中。你可能想检查QuartzDesk(其中我是原作者,所以我有点偏见),或其他类似的产品,如(只是谷歌“石英调度器gui”)。
你在使用'@ Scheduled'方法吗? –
现在正在使用的那些将在applicationContext.xml中进行调度,而不是使用注释。我可以切换到注释,但我仍然不知道如何在运行时更改周期。 –
对于动态任务,我不会使用这种机制。考虑使用'ExecutorService'并自己提交任务。或者更好的是,使用石英并通过它来管理任务。 [春天不让你玩预定任务](http://stackoverflow.com/questions/21791853/how-are-spring-taskscheduled-objects-represented-at-runtime)。 –