目录
引言
修改作业和触发器
修改作业详情
修改触发器
源码分析
注意事项
引言
在 Quartz 的集群模式中,持久化的作业(Job)和持久化的触发器(Trigger)是可以被修改的。修改这些对象通常涉及更新它们的属性或调度配置,并将这些更改持久化到共享的数据库中,以确保集群中的所有节点都能够获取到最新的状态。
修改作业和触发器
在 Quartz 中,作业本身(即Job类的实例)通常不直接修改,因为作业的定义是静态的(例如,作业的执行逻辑)。然而,作业的配置(JobDetail)和与之关联的触发器可以修改。例如,你可以修改作业的JobDataMap或触发器的调度计划。
修改作业详情
要更新作业详情,你首先需要创建一个新的JobDetail对象,它与原来的作业有相同的标识(job name 和 group),但可以有新的JobDataMap或其他属性。然后,使用Scheduler的 addJob()方法,将replace参数设为true来替换现有作业。
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.usingJobData("newKey", "newValue")
.build();
try {
// 替换现有的作业
scheduler.addJob(job, true);
} catch (SchedulerException se) {
se.printStackTrace();
}
修改触发器
修改触发器涉及到获取当前的触发器,修改其属性,然后使用rescheduleJob()方法来更新这个触发器。
try {
TriggerKey triggerKey = new TriggerKey("myTrigger", "group1");
// 检索当前的触发器
CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 创建新的触发器构建器基于老的触发器,并修改属性
TriggerBuilder<CronTrigger> tb = oldTrigger.getTriggerBuilder();
// 创建一个新的触发器定义
Trigger newTrigger = tb.withSchedule(CronScheduleBuilder.cronSchedule("0/30 * * * * ?"))
.build();
// 用新的触发器替换旧的触发器
scheduler.rescheduleJob(triggerKey, newTrigger);
} catch (SchedulerException se) {
se.printStackTrace();
}
源码分析
在org.quartz.core.QuartzScheduler类中,addJob()和rescheduleJob()方法是处理作业和触发器更新的关键方法。这些方法最终调用JobStore的方法来更新数据库中相应的记录。
- addJob()方法调用JobStore的storeJob()方法。
- rescheduleJob()方法调用JobStore的replaceTrigger()方法,这涉及到检查新触发器的有效性(如时间设置)并更新数据库。
注意事项
修改作业详情或触发器时,必须确保任何更改不会违反已设定的约束(如触发器类型或时间规范)。此外,在集群环境中,修改操作必须通过集群的所有节点同步,这通常由Quartz的集群管理功能自动处理。
总之,通过适当的API调用和确保作业与触发器的标识符保持一致,可以在 Quartz 的集群模式中安全地修改持久化的作业和触发器。这些操作涉及到数据库层的交互,确保集群的所有节点都能识别和应用这些更改。