背景
最近调研调度工具时, 看到了 Github 上的XXL-JOB,已在美团内部、以及其他公司有生产应用。
特点
整体情况: XXL-JOB是基于开源 Quartz 调度内核的、为方便企业调度场景而开源的一款实用的调度工具。自带任务配置页面, 任务监控, 分布式执行器等功能。
- 支持在页面上下发 Groovy, Shell 等脚本任务; 也可以通过在Executor中内置任务
- 具备在多个 Executor 中轮转调度的能力(包括简单的任务分片功能)
- 调度任务是一个整体, 不能编辑一个大任务的流程图, 并跟踪每个节点的执行状态
- 多个任务之间, 无法配置依赖关系、依次运行(比如上游任务给下游任务发信号)
调度内核
见 xxl-job-admin 配置:
<bean id="quartzScheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="autoStartup" value="true" /> <!--自动启动 -->
<property name="startupDelay" value="20" /> <!--延时启动,应用启动成功后在启动 -->
<property name="overwriteExistingJobs" value="true" /> <!--覆盖DB中JOB:true、以数据库中已经存在的为准:false -->
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>
- 内核依赖Quartz, 任务信息注册到mysql中, 在指定的时间点(cron表达式), SchedulerFactoryBean 会根据任务信息指定的 job class 来拉起任务, xxl-job-admin 再把任务分配到executor中运行。
- xxl-job-admin和job-executor之间, 使用了自定义的rpc协议,该rpc使用hessian 做序列化,在http层传输
- 分片广播: xxl-job-admin将分片分别发送到job-executor,executor在线程上下文中获取分片索引