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的不一致时,此时其它节点通过该监听器可以达到调度通过的目的。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是根据 Quartz定时器官方文档翻译的,只翻译了第1到第10课,如有翻译不精确的地方,请读者指正,互相学习,...
    ChinaXieShuai阅读 8,480评论 1 19
  • 作业的必要性以及存在的问题 1. 为什么需要作业? 作业即定时任务。一般来说,系统可使用消息传递代替部分使用作业的...
    Sununy阅读 6,870评论 3 25
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,904评论 18 139
  • 到了周末,宅在宿舍里懒得出门想叫份外卖,找到美团时发现熟悉的图标已经不见了,取而代之的是一只袋鼠,一副跃跃奔...
    猫山王一大颗阅读 5,243评论 16 18
  • 谨记切勿沾染任何毒品paranoid 妄想症 marijuana 大麻 当我终于鼓起勇气,想提笔记录下这些天的种种...
    Meldonization阅读 380评论 0 0