终于到了任务执行阶段,当manager(或者在任务恢复/暂停Timer里)调用resume后,会启动执行线程执行任务。根据配置的参数,启动1个或者多个线程去执行线程。具体的流程如下:
- 1.若调度被停止,那么将当前线程移除,若是最后一个线程,还需要注销调度服务(也就是将manager中的processor设置为null),然后直接返回,否则:
- 2.加载需要处理的数据。(从共享数据队列中取出第一个,若数据没有在可能重复的队列中,则返回该数据)
- 3.若加载的数据为空,需要重新加载数据,否则执行步骤4
- 3.1 判断是否已经加载过或者任务被停止,则返回否则如下:
- 3.2 拷贝当前正在执行的数据(将当前正在执行的数据队列copy一份)用于第2步判断是否可能重复执行;
- 3.3 获取当前调度的应该处理的Item
- 3.3.1 判断是否需要重新加载item,若否的话到第,是的话到:
- 3.3.2 若当前processor不为null, 则等待之前加载的数据已经处理完成;
- 3.3.3 重新加载数据;
- 3.3.4 重置需要重新加载Item标志为falas;
- 3.3.5 返回当前currentTaskItemList
- 3.4 若当前taskItem不为空,则执行selectTask, 将任务的参数,分片信息(taskItems)传入到客户端,获取需要处理的数据;
- 3.5 当没有数据的时候,判断是否需要退出调度;
- 3.5.1 当前任务分片不为空且允许开始时间不为空且允许结束时间为空则暂停调度,返回true, 否则返回false;
- 3.5.2 若不需要停止调度,则休眠一定时间;
- 3.6 返回加载的数据队列,返回步骤1
- 4.执行execute方法,客户端控制的,完鸟。
该部分流程图如下:
下一节将讲述对分布式调度系统的思考另外,文章最开始写作于有道笔记,为一边读代码一边写入,部分内容可能没有及时同步。可移步至TbSchedule任务的执行