重调度监听管理器io.elasticjob.lite.internal.config.RescheduleListenerManager
只会启动一个监听器:cron表达式变更重触发调度监听器io.elasticjob.lite.internal.config.RescheduleListenerManager.CronSettingAndJobEventChangedJobListener
。
public void start() {
addDataListener(new CronSettingAndJobEventChangedJobListener());
}
该监听器会监听来自zk节点jobName/config
数据变更的事件通知。当该节点的任务配置信息被修改时,如果当前调度未关闭,则触发当前任务重新调度:以zk配置的cron表达式覆盖当前实例的cron表达式,从而达到所有运行实例调度信息统一修改的目的。
触发重调度条件
configNode.isConfigPath(path) && Type.NODE_UPDATED == eventType && !JobRegistry.getInstance().isShutdown(jobName)
重新调度
JobRegistry.getInstance().getJobScheduleController(jobName).rescheduleJob(LiteJobConfigurationGsonFactory.fromJson(data).getTypeConfig().getCoreConfig().getCron());
上述方法会根据最新的crom表达式重新创建CronTrigger,重新调取前会判断当前的cron表达式是否和当前一致,不一致时才会调用调度器的rescheduleJob
方法。
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerIdentity, null);
if (!scheduler.isShutdown() && null != trigger && !cron.equals(trigger.getCronExpression())) {
scheduler.rescheduleJob(triggerIdentity, null, createTrigger(cron));
}
一般情况下,触发任务cron表达式修改的场景可包含:
- 通过elastic job提供的控制台进行修改。通过提供的配置界面,可以直接修改调度表达式。
- 新启动实例的任务配置中要求覆盖zk的配置,且当前实例的调度表达式与zk的不一致时,此时其它节点通过该监听器可以达到调度通过的目的。
网友评论