(一)xxl-job介绍以及搭建过程
(二)xxl-job执行器端的执行器自动注册原理
(三)xxl-job调度器端的执行器自动注册原理
(四)xxl-job任务管理以及调度器端任务手动执行的原理
(五)xxl-job调度器端任务启动执行的原理
(六)xxl-job执行器端接收调度器任务执行的原理

前言

在v2.1.0 Release版本中已经移除了quartz依赖,降低了依赖,提高了系统的可控性和稳定性。
此版本才用的通讯方案是"NETTY_HTTP"方案,执行器内嵌netty-http-server提供服务,调度中心复用容器端口提供服务。

执行器注册流程
1、打开执行器管理,我们添加一条执行器



AppName: 是每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册。可通过该配置自动发现注册成功的执行器, 供任务调度时使用;(AppName在执行器的属性文件配置了 xxl.job.executor.appname=xxl-job-executor-sample
名称: 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;
排序: 执行器的排序, 系统中需要执行器的地方,如任务新增, 将会按照该排序读取可用的执行器列表;
注册方式:调度中心获取执行器地址的方式;
       自动注册:执行器自动进行执行器注册,调度中心通过底层注册表可以动态发现执行器机器地址;
       手动录入:人工手动录入执行器的地址信息,多地址逗号分隔,供调度中心使用;
机器地址:"注册方式"为"手动录入"时有效,支持人工维护执行器的地址信息;

2、注册流程

1)先看看执行器中XxlJobConfig

2)创建XxlJobSpringExecutor 对象并且初始化执行start方法

@Configuration
public class XxlJobConfig {..............................................//创建XxlJobSpringExecutor 对象,并且初始化执行XxlJobSpringExecutor 的start方法@Bean(initMethod = "start", destroyMethod = "destroy")public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppName(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}

3)执行XxlJobSpringExecutor的start()方法

public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationContextAware {@Overridepublic void start() throws Exception {//初始化JobHandler 仓库  注册JobHandler // init JobHandler RepositoryinitJobHandlerRepository(applicationContext);// refresh GlueFactoryGlueFactory.refreshInstance(1);//接着执行XxlJobExecutor的start()方法// super startsuper.start();}}

然后执行XxlJobExecutor 的start()方法

public class XxlJobExecutor  {
//执行start()方法public void start() throws Exception {//初始化admin调度中心代理类//轮询调度中心地址,多个地址用逗号隔开,每当遇到一个地址就生成动态代理类dminBiz//然后把所有的动态代理类都存入adminBizList中initAdminBizList(adminAddresses, accessToken);//初始化xxlRpc(通过netty实现) ,完成注册initRpcProvider(ip, port, appName, accessToken);}}

我们进入initAdminBizList(),我们看到有个getObject()方法,此方法生成代理类。

invoke方法并不会立即执行

  public Object getObject() {//获取调度中心代理类dminBizreturn Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{this.iface}, new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String className = method.getDeclaringClass().getName();String varsion_ = XxlRpcReferenceBean.this.version;String methodName = method.getName();Class<?>[] parameterTypes = method.getParameterTypes();Object[] parameters = args;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。if (finalAddress != null && finalAddress.trim().length() != 0) {//封装请求  调度中心类名 方法名 以及参数XxlRpcRequest xxlRpcRequest = new XxlRpcRequest();xxlRpcRequest.setRequestId(UUID.randomUUID().toString());xxlRpcRequest.setCreateMillisTime(System.currentTimeMillis());xxlRpcRequest.setAccessToken(XxlRpcReferenceBean.this.accessToken);xxlRpcRequest.setClassName(className);xxlRpcRequest.setMethodName(methodName);xxlRpcRequest.setParameterTypes(parameterTypes);xxlRpcRequest.setParameters(parameters);XxlRpcFutureResponse futureResponse;if (CallType.SYNC == XxlRpcReferenceBean.this.callType) {futureResponse = new XxlRpcFutureResponse(XxlRpcReferenceBean.this.invokerFactory, xxlRpcRequest, (XxlRpcInvokeCallback)null);Object var31;try {//通过netty向调度中心请求执行注册XxlRpcReferenceBean.this.client.asyncSend(finalAddress, xxlRpcRequest);XxlRpcResponse xxlRpcResponse = futureResponse.get(XxlRpcReferenceBean.this.timeout, TimeUnit.MILLISECONDS);if (xxlRpcResponse.getErrorMsg() != null) {throw new XxlRpcException(xxlRpcResponse.getErrorMsg());}//var31=dminBizvar31 = xxlRpcResponse.getResult();} catch (Exception var21) {XxlRpcReferenceBean.logger.info(">>>>>>>>>>> xxl-rpc, invoke error, address:{}, XxlRpcRequest{}", finalAddress, xxlRpcRequest);throw (Throwable)(var21 instanceof XxlRpcException ? var21 : new XxlRpcException(var21));} finally {futureResponse.removeInvokerFuture();}return var31;}

我们再来看看initRpcProvider()

 private void initRpcProvider(String ip, int port, String appName, String accessToken) throws Exception {// init, provider factoryString address = IpUtil.getIpPort(ip, port);Map<String, String> serviceRegistryParam = new HashMap<String, String>();serviceRegistryParam.put("appName", appName);serviceRegistryParam.put("address", address);xxlRpcProviderFactory = new XxlRpcProviderFactory();//初始化了一个XxlRpcInvokerFactory和XxlRpcProviderFactory//指定了使用netty服务,序列化工具,IP,端口,//并指定serviceRegistryClass为ExecutorServiceRegistry.class,执行器的自动注册就是在这请求的xxlRpcProviderFactory.initConfig(NetEnum.NETTY_HTTP, Serializer.SerializeEnum.HESSIAN.getSerializer(), ip, port, accessToken, ExecutorServiceRegistry.class, serviceRegistryParam);// add services 增加执行器服务到PRC,用ExecutorBizImpl作为服务的处理类,调用中心可以调用执行器处理任务xxlRpcProviderFactory.addService(ExecutorBiz.class.getName(), null, new ExecutorBizImpl());// start xxlRpcProviderFactory.start();}

xxlRpcProviderFactory.start()执行了ExecutorServiceRegistry初始化

 public void start() throws Exception {this.serviceAddress = IpUtil.getIpPort(this.ip, this.port);this.server = (Server)this.netType.serverClass.newInstance();this.server.setStartedCallback(new BaseCallback() {public void run() throws Exception {if (XxlRpcProviderFactory.this.serviceRegistryClass != null) {//实例化ExecutorServiceRegistryXxlRpcProviderFactory.this.serviceRegistry = (ServiceRegistry)XxlRpcProviderFactory.this.serviceRegistryClass.newInstance();//执行ExecutorServiceRegistry的start()方法,此方法中实例化ExecutorRegistryThread线程并且启动线程执行注册XxlRpcProviderFactory.this.serviceRegistry.start(XxlRpcProviderFactory.this.serviceRegistryParam);if (XxlRpcProviderFactory.this.serviceData.size() > 0) {XxlRpcProviderFactory.this.serviceRegistry.registry(XxlRpcProviderFactory.this.serviceData.keySet(), XxlRpcProviderFactory.this.serviceAddress);}}}});

我们再次跟进ExecutorServiceRegistry类

继续跟进start方法,在这个线程里面有个while循环,之前在getObject()方法中获取的adminBiz动态代理类的adminBizList集合被遍历。registryResult = adminBiz.registry(registryParam)触发了动态代理去注册,实际上通过InvocationHandler的invoke()反射执行registry()方法实现的。

invoke()完成向调度中心发送请求进行服务注册操作
通过反射获取xxl-rpc的代理,然后通过调度中心的地址向调度中心请求注册

调度中心处理执行器的请求

xxl-job(v2.1.0 Release)执行器端的执行器自动注册原理相关推荐

  1. UEditorPlus v2.6.0发布 编辑器草稿功能,操作体验优化

    UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点. UEditorPlus 是有 ModStart 团队基于 UEd ...

  2. 热血江湖服务端 linux,热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程

    热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程 本人没有测试过!!!本人没有测试过!!!本人没有测试过!!! 可升级120级,个别服升150级8转 爆率低 特别是强化石 强化石可以叠加 ...

  3. php热血江湖怎么安装,端游【热血江湖】V2.0商业服务端百宝阁 GM工具+客户端+架设教程...

    热血江湖V2.0商业服务端百宝阁 GM工具+客户端+架设教程 本人没有测试过!!!本人没有测试过!!!本人没有测试过!!! 可升级120级,个别服升150级8转 爆率低 特别是强化石 强化石可以叠加 ...

  4. 堡垒机应用发布服务器是干嘛的_支持Web UI数据库审计和敏感数据国密算法加密,JumpServer堡垒机v2.5.0发布丨Release Notes...

    11月18日,JumpServer开源堡垒机正式发布v2.5.0版本.该版本的新增功能包括:支持Web UI数据库审计(X-Pack增强包内).支持敏感数据国密算法加密.新增克隆创建.新增高危命令告警 ...

  5. 文件管理功能重构,MeterSphere开源持续测试平台v2.1.0发布

    2022年8月29日,MeterSphere一站式开源持续测试平台正式发布v2.1.0版本. 在这一版本中,MeterSphere的UI测试模块对鼠标指令进一步扩展,实现了绘图核心场景的覆盖:在测试跟 ...

  6. FPV Camera(RPI3+V2.1) | wfb_ng Release 23.01 | ubuntu20.04 gnome软解测试

    @[TOC](FPV Camera(RPI3+V2.1) | wfb_ng Release 23.01 | ubuntu20.04 gnome软解测试) 1. 简介 最近搭建了基于树莓派和wfb_ng ...

  7. Apache Kylin v2.5.0正式发布,开源分布式分析引擎

    文章转载自开源中国,作者 Apache Kylin 社区 日前,Apache Kylin 社区宣布,Apache Kylin v2.5.0 正式发布. Apache Kylin 是一个开源的分布式分析 ...

  8. jeecg-framework-3.1.0.RELEASE 正式发布

    [jeecg-framework-3.1.0.RELEASE(精简版)升级日志] ---------------------------------------- version: jeecg-fra ...

  9. MaxKey单点登录认证系统 v2.4.0 RC

    介绍: MaxKey(马克思的钥匙)用户单点登录认证系统(Sigle Sign On System),寓意是最大钥匙,是业界领先的企业级IAM身份管理和身份认证产品,支持OAuth 2.0/OpenI ...

最新文章

  1. 怎么获取html的某个元素,MSHTML怎么获取一个网页元素对象
  2. 第三章 改进神经网络的学习方式(上中)
  3. JAVA程序员面试题集合
  4. 互联网公司常用MySQL分库分表方案
  5. freeredius3.0 mysql_EDIUS非线性编辑系统价格,4k视频编辑系统
  6. 教你如何迅速秒杀掉:99%的海量数据处理面试题
  7. 《编写有效用例》阅读笔记05
  8. Tomcat5.5中配置虚拟路径
  9. 如何批量删除.svn文件
  10. 按位与、或、异或等运算方法(转)
  11. Android Open Source Projects(汇总与整理)
  12. mysql仓库管理软件破解版_Max(TM)仓库管理软件|Max(TM)仓库管理系统下载_v2.0.5.1 MySQL网络版_9号软件下载...
  13. COPRA RF 2005 SR1最新版 (冷弯成型,轧辊设计)
  14. 玩客云折腾记录(一):编译 ArmBian 系统
  15. WORD分节、分页、设不同页码页眉的方法
  16. Unity内截屏实现
  17. 《炬丰科技-半导体工艺》薄晶圆处理挑战和新兴解决方案
  18. 关于小米 Mi4 手机的评测
  19. java获取输入的地点的经纬度和编码等信息
  20. [读书笔记] Deep learning by Yann LeCun1,2, Yoshua Bengio3 Geoffrey Hinton4,5 on nature

热门文章

  1. idea2021背景色更改
  2. 判断WIFI打开关闭,飞行模式打开关闭
  3. 【DUBBO】——dubbo是什么以及使用dubbo 实现远程接口服务调用
  4. JavaScript实例第十六天
  5. photoshop2019安装使用图文教程_图文(附安装包)
  6. android平板触控笔,产品轻体验系列 篇一:买平板到底要不要买配件?华为MatePad10.8磁吸键盘/触控笔体验...
  7. 微信小程序如何实现上拉加载更多数据?
  8. 毕业设计-基于Springboot实现图书管理系统
  9. c语言入门——函数的递归
  10. interrupt()方法和InterruptException异常