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

标签 java spring scheduled-tasks quartz-scheduler scheduler

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

恐怕这是 Spring 的一部分,我或多或少 100% 无知,花了一个下午阅读有关它的文章并没有阐明太多事情。

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

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

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

感谢您的帮助!

最佳答案

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

在 Spring applicationContext 中,您很可能有一个调度程序 bean (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 (我是原作者,所以我在这里有点偏见),或其他类似的产品(只需谷歌搜索“quartz Scheduler gui”)。

关于java - 在运行时更改 Spring 任务的预定时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24680468/

相关文章:

java - 是否有适用于 ARM Linux 的 java sqlite3 库?

java - 在本地模式下运行 Apache Storm 连接错误

Spring:Azure 功能管理器功能切换 Microsoft.Targeting bean 未找到

java - DWR 2 至 DWR 3 cometd

java - Spring 将 servlet contextConfigLocation 类视为路径,尽管 contextClass 正确

java - 如何纠正我的第一个 Spring Boot POM

Spring RMI : How to expose without App server or servlet container?

java - 独立的进程,每个进程都在多线程JAVA中运行

java - 使用 Quartz 来安排作业

linux - 在 *nix 上有没有办法在未来的日期和时间触发进程?