elastic job源码分析 - 重调度监听管理器

重调度监听管理器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表达式修改的场景可包含:

  1. 通过elastic job提供的控制台进行修改。通过提供的配置界面,可以直接修改调度表达式。
  2. 新启动实例的任务配置中要求覆盖zk的配置,且当前实例的调度表达式与zk的不一致时,此时其它节点通过该监听器可以达到调度通过的目的。

你可能感兴趣的:(elastic job源码分析 - 重调度监听管理器)