XxlJob调度中心的启动过程

同样地,分析调度中心也从它的启动过程入手,本文先分析一下启动过程中大概做了什么事情。


XxlJobAdminConfig

该类实现了Spring Framework的InitializingBean接口,所以在该bean被创建之后会被调用afterPropertiesSet方法。

v2.4.0
java
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
// 实现InitializingBean中的afterPropertiesSet()方法
@Override
public void afterPropertiesSet() throws Exception {
    adminConfig = this;

    // 创建调度器对象
    xxlJobScheduler = new XxlJobScheduler();
    // 初始化调度器
    xxlJobScheduler.init();
}

这里是委托给XxlJobScheduler来做的初始化。

XxlJobScheduler

v2.4.0
java
xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
public void init() throws Exception {
    // init i18n
    // 初始化国际化
    initI18n();

    // admin trigger pool start
    // 创建快慢两个线程池
    JobTriggerPoolHelper.toStart();

    // admin registry monitor run
    // 启动服务注册线程
    JobRegistryHelper.getInstance().start();

    // admin fail-monitor run
    // 开启任务失败处理线程
    JobFailMonitorHelper.getInstance().start();

    // admin lose-monitor run ( depend on JobTriggerPoolHelper )
    // 启动任务完成处理线程
    JobCompleteHelper.getInstance().start();

    // admin log report start
    // 日志整理收集
    JobLogReportHelper.getInstance().start();

    // start-schedule  ( depend on JobTriggerPoolHelper )
    // 启动基础调度线程和时间轮调度线程
    JobScheduleHelper.getInstance().start();

    logger.info(">>>>>>>>> init xxl-job admin success.");
}

启动快慢线程池

v2.4.0
java
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
public static void toStart() {
    helper.start();
}
public void start(){
    // 创建快线程池,用于处理执行时间短的任务
    fastTriggerPool = new ThreadPoolExecutor(
            10,
            XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(),
            60L,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(1000),
            new ThreadFactory() {
                @Override
                public Thread newThread(Runnable r) {
                    return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode());
                }
            });

    // 创建慢线程池,用于处理执行时间长的任务
    slowTriggerPool = new ThreadPoolExecutor(
            10,
            XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(),
            60L,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(2000),
            new ThreadFactory() {
                @Override
                public Thread newThread(Runnable r) {
                    return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode());
                }
            });
}

这两个线程池分别用来调度不同调度时长的任务。

关于其他几部分的内容,这里暂时不分析,因为各种线程的创建及其逻辑耦合在了一起,后面单独写文章来分析。