pom文件配置需要特别注意的地方:
xxl-job框架自带的spring-boot版本为:1.5.21.RELEASE,与此匹配的spring-cloud版本为:Edgware.SR3,与spring-cloud版本匹配的spring-cloud-consul的版本为:1.3.3.RELEASE
执行器主要业务逻辑都在一个个jobHandler中,在jobHandler中完成所有的业务逻辑
xxl-job的系统组成:
主要就是分为调度中心和执行器,调度中心负责发起调度请求,将任务抽象成分散的jobHandler,交由执行器统一管理,本身不承担业务逻辑,执行器负责接收调度请求并执行对应的JobHandler中的业务逻辑,调度和任务两部分解耦,提高了系统整体稳定性和扩展性
xxl-job工作原理:
1.任务执行器根据配置的调度中心的地址,启动注册线程向调度中心的执行器管理发起自动注册,执行器管理保存注册执行器,后续根据注册信息给执行器下发任务。
2.执行器中的任务执行服务接收到任务后会将任务发送到待执行任务的队列中,队列中的任务会由执行线程依次获取并执行,执行线程会被维护到一个线程池中。
3.执行结果会被放到执行结果队列中,同时会把执行日志写入任务日志文件中,线程销毁任务结束,回调线程通知调度中心的监控运维模块,任务执行完毕。
4.日志查询:调度中心发送日志查询请求给任务执行器中的日志服务,然后查询任务日志文件实现。
* 问题:执行器HA,调度中心HA,添加任务调度时各个参数的含义,调度中心连数据库的原因。
调度中心连接数据库的原因
调度中心的任务管理:会将任务信息存到db中(xxl_job_info表是记录定时任务的db表),trigger_next_time(Long)字段,表示下一次触发的时间点,任务时间被修改 / 每一次任务触发后,trigger_next_time字段会更新
定时触发任务实现逻辑:使用时间轮实现
定时任务scheduleThread,不断从db中读取5秒内要执行的任务,立即触发 / 放到时间轮等待触发,并更新trigger_next_time
定时任务ringThread:时间轮实现到点触发任务,读取任务列表id---触发任务
当xxl-job应用本身(即:调度中心)集群部署(实现高可用HA)时,如何避免集群中的多个服务器同时调度任务?(即:分布式部署时,一个任务只执行一次)
通过悲观锁实现分布式锁(for update语句)
具体解释:即使是分布式部署,每个定时任务还是存储到db中,执行时从db拉取,所以只要保证db唯一即可
setAutoCommit(false)关闭隐式自动提交事务,启动事务 select lock for update(显式排他锁,其他事务无法进入&无法实现for update) 读db任务信息 -> 拉任务到内存时间轮 -> 更新db任务信息 commit提交事务,同时会释放for update的排他锁(悲观锁)
* 问题:调度中心如何实现HA?(应该是具体应用场景具体分析吧)
任务执行器注册中心是如何实现的?
使用db表xxl_job_group记录下执行器的信息:执行器AppName、执行器名称title、执行器地址列表address_list(多地址逗号分隔)
如何实现任务执行器的路由?(有关执行器HA)
执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等(即:定时任务选择哪一个执行器执行)
任务执行器中的一些参数:
1.子任务ID:
任务详情页的任务ID,添加后即为当前任务的后续任务,后续任务执行的前提是上一个任务执行成功
2.路由策略:
执行器分布式部署时,选择执行器的策略
3.阻塞处理策略(三个参数):
单机串行:根据子任务ID串行执行
丢弃后续调度:同一appname 只有一个执行器时,才能正常运作,因为任务是否在运行是在一个执行器上检查的
覆盖之前调度:一个执行器
4.任务超时时间:
任务运行超时的情况下,将会主动中断任务;



