xxl-job-admin调度中心流程
最近一直在研究xxl-job,所以就分析了下调度的流程,做个记录。
1.调度中心说明
调度中心主要负责提供UI界面进行任务的配置工作,配置好任务之后,只要点击了启动,任务就会发送给执行器进行执行。
2.调度中心任务调度源码分析
xxl-job-admin模块为springboot项目,springboot项目启动的时候会加载响应的配置,其中与任务调度相关的配置如下
代码来源:com.xxl.job.admin.core.conf.XxlJobAdminConfig
该类继承了InitializingBean,所以需要重写afterPropertiesSet方法,初始化的时候会调用该方法。
/**
* xxljob的任务初始流程
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
adminConfig = this;
xxlJobScheduler = new XxlJobScheduler();
// 调用它的初始化方法
xxlJobScheduler.init();
}
xxlJobScheduler.init()方法执行
public void init() throws Exception {
// init i18n
initI18n();
/**
* 初始化快慢线程池的方法
*/
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.");
}
JobTriggerPoolHelper.toStart() 初始化快慢线程池,执行任务的时候会进行选择
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());
}
});
}
JobScheduleHelper.getInstance().start() 开启执行任务的循环,只要发现有未执行的任务就会去执行
方法太长只显示核心部分
/**
* 死循环调用
*/
while (!scheduleThreadToStop) {
// Scan Job
long start = System.currentTimeMillis();
Connection conn = null;
Boolean connAutoCommit = null;
PreparedStatement preparedStatement = null;
boolean preReadSuc = true;
try {
// 获取数据源链接
conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();
connAutoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
preparedStatement.execute();
....
// 执行的核心方法触发任务的执行
JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null);
JobTriggerPoolHelper.trigger触发任务的执行
public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) {
// 触发任务
helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);
}
helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, a