本文概览:介绍了调度平台和执行器通过RPC进行交互的流程。

1  RPC

调度平台在XxlJobScheduler初始化Adminbiz Server Executorbiz Client;调度平台在XxxlJobExecutor中初始化Adminbiz Client Executorbiz Server

1

  • ExecutorBiz Server。直接使用调度平台的服务作为Http Server。
  • ExecutorBiz Client。调度平台新建一个XxlRpcReferenceBean,通过一个NettyClient发送给执行器信息:ExecutorBiz类名称、method信息,执行器拿到这个信息之后,执行相应ExecutorBiz的method。这个是一个RPC的流程。
  • AdminBiz Server。使用netty实现一个Http Servrer。
  • AdminBiz Client。执行器新建一个XxlRpcReferenceBean,通过一个NettyClient发送给调度平台信息:AdminBiz类名称、method信息,调度平台拿到这个信息之后,执行相应AdminBiz的method。这个是一个RPC的流程。

1.1 调度平台端的RPC-XxlJobScheduler

1.1.1 AdminBiz服务端

服务端AdminBiz是怎么接受客户端的RPC的请求?没有单独定义AdminBiz sever,直接使用调度平台服务作为server。

STEP1:  调度平台提供JobApiController#api接口,接受所有uri为/api的请求。

STEP2:XxlJobScheduler.invokeAdminService

STEP3: 通过ServletServerHandler来实现

  • 将htppservletRequest转换成XxlRpcRequest
  • 根据XxlRpcRequest找到中类名和函数名,使用反射调用真正AdminBiz的实现类。

1.1.2  ExcutorBiz的客户端

以查看日志为例

2

STEP1  通过XxlJobScheduler.getExecutorBiz获取ExcutorBiz的动态代理对象

STEP2 获取ExcutorBiz的动态代理对象

STEP3 动态代理对象XxlRpcReferenceBean作为一个RPC的client来执行远程调用RPC服务端。

1.2 执行器端的RPC-XxxlJobExecutor

1.2.1 AdminBiz客户端

XxxlJobExecutor通过XxlRpcReferenceBean构建AdminBiz的客户端,通过XxxlJobExecutor#getAdminBizList来获取AdminBiz的Client,调用调用平台的AdMinBiz的Server。

1.2.2  ExecutorBiz的服务端

通过XxlJobScheduler定义ExecutorBiz的Http Server,接受调度平台的ExecutorBiz Client的请求,比如调度任务的操作ExecutorBiz#run(triggerParm)

2 系统交互

调度平台和客户端功能如下:

(1)调度平台

  • 注册中心,提供心跳功能
  • 触发任务逻辑。

(2)客户端ExecutorBiz

  • 客户端调用服务端心跳接口
  • 服务端发送触发任务信息,在客户端映射为@JobHandler,然后返回触发成功。在客户端通过JobTread触发所有的任务@JobHadnerl
  • 任务执行完成之后通知服务端,返回执行成功。客户端执行完成任务,通过TriggerCallbackThread将执行完成任务的结果发动给服务端

2.1 注册中心

1

1、注册信息的数据表

  • xxl_job_registry,单实例的信息,如心跳信息
  • xxl_job_group,每个服务注册实例list

2、执行器启动注册线程ExecutorRegistryThread:每30秒向注册表请求一次,更新执行器心跳信息。

3、调度中心启动线程JobRegistryMonitorHelper:每30秒检测一次xxl_job_registry,将超过90秒还没有收到心跳的实例信息从xxl_job_registry中删除,并更新xxl_job_group服务的实例列表信息。

2.2 调度平台触发任务流程

Snip20200909_4

2.2.1 调度平台端

1、XxxJobScheduler入口

2、JobScheduleHelper 扫描5s待触发的任务,加入到ring中或者直接执行。

这个环抽象了一个分钟秒盘,比如现在是14:15:10,即此时在环的10这个位置,那么执行14:15:10(对应环的10)和14:15:11 (对应环的11位置)的任务。

3、JobTriggerPoolHelper#trigger 触发任务

4、XxlJobTrigger#trigger

  • 通过路由规则选择执行器实例
  • 通过XxlJobScheduler获取RPC对象ExecutorBiz(类似于一个Dubble对象),执行触发任务

新建一个XxlRpcReferenceBean,通过一个NettyClient发送给客户端信息:ExecutorBiz类名称、method信息,客户端拿到这个信息之后,执行相应ExecutorBiz的method。这个是一个RPC的流程。

2.2.2 执行器端

1、JobThread在队列为空时如何处理?当30次*3s=90s空闲,线程就被中断。

2、JobThread维护一个阻塞队列LinedBlockingQueue的原因是可能一个任务被触发多次。这个时候只有一个JobThread来进行处理,同时只有一次调用被处理,其他调用放置在队列中。

2.3 执行器初始化

1、XxlJobSpringExecutor

2、XxxlJobExecutor

3 数据表

xxl_job_group :服务的注册信息。

xxl_job_registry :服务注册的每个实例信息,包括心跳。

xxl_job_info:任务信息

xxl_job_lock: 分布式锁

xxl_job_log :执行log

xxl_job_logglue:shell脚本

xxl_job_user :用户和用户权限

参考

https://www.cnblogs.com/guoyinli/p/11555035.html

1

分类&标签