我需要编写一个调度程序(spring 4 application) 我在DB中有多个开火时间(开始时间)。我可以通过UI手动创建/删除它们。对于每个这个开始时间,我需要调用该方法。
我不能使用原生@Scheduled的原因是:
1)我的任务不重复(但不是那么重要);
2)我需要手动处理开始时间。它不应该是硬编码或在属性中设置。我需要有可能在任何时候从UI添加新的触发器而无需重新部署。
关于Quartz触发器,我不确定它是否符合我的问题。正如我所看到的:我需要编写一些服务,每隔几秒就会根据数据库的时间相应地更新所有触发器。
那么,对我的问题最好的方法是什么?
答案 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),您只能使用调度程序接口。