项目地址github:
项目目录介绍:
xxl-job-admin:调度中心(server端启动项目包括页面)
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适执行器)
:xxl-job-executor-sample-springboot:Springboot 版本管理执行器
:xxl-job-executor-sample-frameless:无框架版本
全文目录:
1.架构图
2.xxl-job-admin 调度中心源码解析及相关数据结构分析
3.快慢线程池JobTriggerPoolHelper源码解析
4.任务依赖解析
1.xxl-job-admin 调度中心
Springboot启动类:src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java
启动后调用XxlJobAdminConfig类,初始化XxlJobScheduler类
@Component
public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
private static XxlJobAdminConfig adminConfig = null;
public static XxlJobAdminConfig getAdminConfig() {
return adminConfig;
}
// ---------------------- XxlJobScheduler ----------------------
private XxlJobScheduler xxlJobScheduler;
@Override
public void afterPropertiesSet() throws Exception {
adminConfig = this;
xxlJobScheduler = new XxlJobScheduler();
xxlJobScheduler.init();"
}
@Override
public void destroy() throws Exception {
xxlJobScheduler.destroy();
}
初始化XxlJobScheduler
public class XxlJobScheduler {
private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
public void init() throws Exception {
// init i18n
initI18n();
// 初始化快、慢线程池触发器 调用XxlJobTrigger
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.。。");
}
......
)
重点分析 JobScheduleHelper 作业调度类
- 使用Map<Integer, List<Integer>> 的数据结构存储将要执行的任务清单,其中Integer的范围为0-60,list中存储将要执行的JobID
- 使用scheduleThread线程扫描mysql中将要执行的调度清单
- 使用ringThread线程执行第一步map中的执行清单
执行流程图如下:
scheduleThread线程详细代码如下:
1、 从数据库中查询出下次执行时间小于等于当前时间+5s的所有执行任务列表
//悲观锁
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
preparedStatement.execute();
// 1、pre read 查询出下次执行时间小于等于当前时间+5s的执行任务列表
long nowTime =