具有DB自定义开火时间的调度程序

时间:2016-04-26 09:05:56

标签: java spring scheduled-tasks quartz-scheduler

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

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

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

那么,对我的问题最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

可以更新现有触发器或用石英替换另一个触发器。因此,当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),您只能使用调度程序接口。