【问题标题】:Scheduler with custom fire time from DB具有来自 DB 的自定义触发时间的调度程序
【发布时间】:2016-08-20 00:08:18
【问题描述】:

我需要编写一个调度程序(spring 4 应用程序)。
我在 DB 中有多个触发时间(开始时间)。我可以通过 UI 手动创建/删除它们。对于每个开始时间,我都需要调用该方法。

我不能使用原生@Scheduled 的原因是:
1) 我的任务不是重复的(但也没什么大不了的);
2)我需要手动处理开始时间。它不应该被硬编码或在属性中设置。我需要随时从 UI 添加新触发器而无需重新部署的可能性。

关于 Quartz Triggers,我不确定它是否符合我的问题。正如我所看到的:我需要编写一些服务,每隔几秒就会根据 DB 的时间更新所有触发器。

那么,解决我的问题的最佳方法是什么?

【问题讨论】:

  • 使用 JPA(或其他)支持的 Quartz。通过 Quartz 而不是直接操作任务。

标签: java spring scheduled-tasks quartz-scheduler


【解决方案1】:

可以更新现有触发器或用石英替换另一个触发器。因此,当您 HMI 更新/添加触发器时,然后在您的数据库中更新/添加它并在调度程序中更新/添加。

更新现有触发器:

// retrieve the trigger
Trigger oldTrigger = sched.getTrigger(triggerKey("oldTrigger", "group1");

// obtain a builder that would produce the trigger
TriggerBuilder tb = oldTrigger.getTriggerBuilder();

// update the schedule associated with the builder, and build the new trigger
// (other builder methods could be called, to change the trigger in any desired way)
Trigger newTrigger = tb.withSchedule(simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(10)
.build();
//Reschedule
sched.rescheduleJob(oldTrigger.getKey(), newTrigger);

更换触发器:

// Define a new Trigger
Trigger trigger = newTrigger()
.withIdentity("newTrigger", "group1")
.startNow()
.build();

// tell the scheduler to remove the old trigger with the given key, and put the new one in its place
sched.rescheduleJob(triggerKey("oldTrigger", "group1"), trigger);

Those examples 来自quartz documentation

如果您选择使用 JDBC JobStore,请不要直接在石英表中写入/更新任何内容。

您不应访问 JobStore(对于任何类型的 JobStore),您必须仅使用调度程序接口。

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多