分析ejob怎样扩展quartz
- 根据上图发现,在创建JobDetail时指定了LiteJob,并注入了其jobExecutor属性
- quartz启用调度,最终会触发调用ElasticJobExecutor#execute方法
- 通过配置quartz配置SimpleThreadPool的线程数为1
(1)每个定时任务分配一个单线程池
ElasticJobExecutor#execute执行作业任务(重点)
- 从缓存中加载作业配置(从zk中加载)
- 检查是否需要加载可重新加载的项目
2.1 可重新加载的项如下图
2.2 以线程池重新加载为例分析
(1)对比作业配置和ExecutorServiceReloadable的jobExecutorServiceHandlerType,如果发生变化,则重新加载
(2)线程池重新调整:ExecutorServiceReloadable#reload - guava上发布JobStatusTraceEvent事件(任务启动中状态)
3.1 TracingListener#listen方法接收订阅(@Subscribe) - 在任务执行前,遍历任务监听器,并执行其beforeJobExecuted方法
- 任务执行:execute(jobConfig, shardingContexts, ExecutionSource.NORMAL_TRIGGER)(下面会详细分析)
- 在任务执行后,遍历任务监听器,并执行其afterJobExecuted方法
ElasticJobExecutor#process(重点)
- 获取分片项,初始化分片数量的CountDownLatch(保证所有分片任务一起执行完)
- 遍历分片项,将处理任务提交到线程池中
线程任务详情
4. 发布任务执行开始事件:JobExecutionEvent
5. 执行业务代码逻辑
6. 发布任务执行结束事件