分布式任务调度平台之XXL-JOB

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen517611641/article/details/88927796

基本架构

  1. GlueFactory + SpringGlueFactory 代码生成IJobHandler对象,并注入@Rosource和@Autowird注解的field;
  2. XxlJobExecutor + XxlJobSpringExecutor的start方法是入口程序
  3. Executor端JobThread将执行的结果ReturnT放到本地的TriggerCallbackThread持有的callbackQueue中,等待TriggerCallbackThread处理,TriggerCallbackThread处理的过程就是ReturnT包装成HandleCallbackParam传给AdminBiz的callback方法;XxlJobExecutor中用来执行JobThread
  4. JobLogFileCleanThread,总结日志策略,配置参数,存储位置,命名规则,怎么发送给admin,清理规则?
  5. Executor ExecutorRegistryThread 不停调用admimbiz的registry注册自己

数据持久化模型

  1. TRIGGER_GROUP:执行器记录,Executor实例,注意与Trigger_REGISTRY的区别
  2. TRIGGER_REGISTRY:只存储在线的执行器
  3. TRIGGER_LOG表,任务执行日志
  4. TRIGGER_LOGGLUE表,存储glue的代码,最多30个历史
  5. TRIGGER_INFO->XxlJobInfo类: 触发器列表,任务列表,不是job

任务调度

Job启动流程

任务管理界面上的启动功能,就是启动任务的调度,按照任务配置的Trigger的规则调度;用户点击启动之后,在admin端生成一个RemoteHttpJobBean的Quartz JobDetails和设置的规则的Quartz CronTrigger,然后使用Quartz Scheduler提供的sheduleJob方法,开始调度任务; 定时任务在admin触发,执行RemoteHttpJobBean,在此Job里调用JobTriggerPoolHelper远程触发任务;admin里的JobTriggerPoolHelper将触发Trigger的操作用线程封装放到线程池中执行实现触发这一步的异步;JobTriggerPoolHelper最终调用XxlJobTriger类中的runExecutor方法,此方法是调真正执行RPC的地方,调用目标executor的ExecutorBiz的run方法,传参TriggerParam类对象;run方法在Executor侧执行,run方法中的逻辑是,生成jobhandler,进一步生成封装JobHandler的JobThread,然后异步执行JobThread;注意:JobThread是对一个JobId生成一个,也就是Trigger_INFO表中的记录,如果此任务已经执行过,则在缓存中就能获取到之前的JobThread对象,只需要将TriggerParam参数pushTriggerQueue方法传给JobThread执行即可,JobThread内部维护了一个队列,其run方法不停的尝试从队列里拿到TriggerParam对象然后处理;执行了IJobHandler的execute方法之后,获取到的结果会放到TriggerCallbackThread持有的HandleCallbackParam队列中,TriggerCallbackThread的run方法会不停的从队列中取一个HandleCallbackParam然后,传给adminBiz#callback方法;job调用结束;

Job执行流程

任务管理界面上的执行,也就是立即执行一次任务的意思;参考Job启动流程;

Job停止流程

用户调用JobInfoController提供的stop接口之后,会在admin端间接调用Quart Scheduler对象的deleteJob方法,从JobStore中删除此Job,因为所有节点都是用的一个数据库,也就达到了在整个集群中删除此任务的目的;

猜你喜欢

转载自blog.csdn.net/chen517611641/article/details/88927796