1 调度中心API服务
  1. 1、任务结果回调服务;
  2. 2、执行器注册服务;
  3. 3、执行器注册摘除服务;
  4. 4、触发任务单次执行服务,支持任务根据业务事件触发;
API暴露代码:com.xxl.job.admin.controller.JobApiController.java
API服务位置:com.xxl.job.core.biz.AdminBiz.java
通过请求参数匹配对应方法反射执行后把结果返回给客户端,见代码com.xxl.rpc.remoting.provider.XxlRpcProviderFactoryinvokeService方法invokeService
 
2 任务注册/执行器注册
任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表;注册表: 见"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表。"执行器"注册代码见com.xxl.job.core.thread.ExecutorRegistryThread方法start,在"执行器"启动时通过远程调用com.xxl.job.core.biz.AdminBiz方法注册。"执行器" 在进行任务注册时将会周期性维护一条注册记录,即机器地址和AppName的绑定关系; "调度中心" 从而可以动态感知每个AppName在线的机器列表; 执行器注册: 任务注册Beat周期默认30s; 执行器以一倍Beat进行执行器注册, 调度中心以一倍Beat进行动态任务发现; 注册信息的失效时间被三倍Beat; 执行器注册摘除:执行器销毁时,将会主动上报调度中心并摘除对应的执行器机器信息,提高心跳注册的实时性。见代码com.xxl.job.admin.core.thread.JobRegistryMonitorHelper
 
3 执行器API服务

执行器提供了API服务,供调度中心选择使用,目前提供的API服务有:

  1. 1、心跳检测:调度中心使用
  2. 2、忙碌检测:调度中心使用
  3. 3、触发任务执行:调度中心使用;本地进行任务开发时,可使用该API服务模拟触发任务;
  4. 4、获取Rolling Log:调度中心使用
  5. 5、终止任务:调度中心使用

API服务位置:com.xxl.job.core.biz.ExecutorBiz
API服务请求参考代码:com.xxl.job.executor.ExecutorBizTest

API暴露代码片段

  1. com.xxl.job.core.executor.XxlJobExecutor.initRpcProvider()
  2. // add services
  3. xxlRpcProviderFactory.addService(ExecutorBiz.class.getName(), null, new ExecutorBizImpl());

API远程调用代码,jetty启动注册一个handler,handler含有API远程调用处理逻辑

  1. com.xxl.rpc.remoting.net.impl.jetty.server.JettyServer.start()
    JettyServer.this.server.setConnectors(new Connector[]{connector});
  2. HandlerCollection handlerc = new HandlerCollection();
  3. handlerc.setHandlers(new Handler[]{new JettyServerHandler(xxlRpcProviderFactory)});
  4. JettyServer.this.server.setHandler(handlerc);
  1. com.xxl.rpc.remoting.net.impl.jetty.server.JettyServerHandler.handle()
  2. XxlRpcResponse xxlRpcResponse = this.xxlRpcProviderFactory.invokeService(xxlRpcRequest);
  3. byte[] responseBytes = this.xxlRpcProviderFactory.getSerializer().serialize(xxlRpcResponse);
  4. this.writeResponse(baseRequest, response, responseBytes);
  1. com.xxl.rpc.remoting.provider.XxlRpcProviderFactory.invokeService()
  2. XxlRpcResponse xxlRpcResponse = new XxlRpcResponse();
  3. xxlRpcResponse.setRequestId(xxlRpcRequest.getRequestId());
  4. String serviceKey = makeServiceKey(xxlRpcRequest.getClassName(), xxlRpcRequest.getVersion());
  5. Object serviceBean = this.serviceData.get(serviceKey);
  6. if (serviceBean == null) {
  7. xxlRpcResponse.setErrorMsg("The serviceKey[" + serviceKey + "] not found.");
  8. return xxlRpcResponse;
  9. } else if (System.currentTimeMillis() - xxlRpcRequest.getCreateMillisTime() > 180000L) {
  10. xxlRpcResponse.setErrorMsg("The timestamp difference between admin and executor exceeds the limit.");
  11. return xxlRpcResponse;
  12. } else if (this.accessToken != null && this.accessToken.trim().length() > 0 && !this.accessToken.trim().equals(xxlRpcRequest.getAccessToken())) {
  13. xxlRpcResponse.setErrorMsg("The access token[" + xxlRpcRequest.getAccessToken() + "] is wrong.");
  14. return xxlRpcResponse;
  15. } else {
  16. try {
  17. Class<?> serviceClass = serviceBean.getClass();
  18. String methodName = xxlRpcRequest.getMethodName();
  19. Class<?>[] parameterTypes = xxlRpcRequest.getParameterTypes();
  20. Object[] parameters = xxlRpcRequest.getParameters();
  21. Method method = serviceClass.getMethod(methodName, parameterTypes);
  22. method.setAccessible(true);
  23. Object result = method.invoke(serviceBean, parameters);
  24. xxlRpcResponse.setResult(result);
  25. } catch (Throwable var11) {
  26. logger.error("xxl-rpc provider invokeService error.", var11);
  27. xxlRpcResponse.setErrorMsg(ThrowableUtil.toString(var11));
  28. }
  29.  
  30. return xxlRpcResponse;
  31. }
 
 
参考资料

xxl-job源码分析的更多相关文章

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  8. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  9. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  10. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

随机推荐

  1. 2018-2019-2 网络对抗技术 20165228 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165228 Exp6 信息搜集与漏洞扫描 回答问题 哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务 ...

  2. HBase学习笔记1 - 如何编写高性能的客户端Java代码

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5577124.html 客户在使用HBase的时候,经常会抱怨说写入太慢,并发上不去等等.从前我遇到这种情况,一般都二 ...

  3. EOS wallet API 报HTTP 400错误

    服务器:192.168.8.144 按照官方的docker方式运行的,因为keosd(钱包)开出来的API只容许本地访问,即: url --request POST --header 'Host: 0 ...

  4. pip install -r requirements.txt

    生成文件 pip freeze > requirements.txt pip install --help Usage: pip install [options] <requiremen ...

  5. PCP

    1, What is PCP?Prior Comparable Period2, Why needs PCP?This is to compare the value with history val ...

  6. Qt学习3---子窗口与父窗口

    创建子窗口后,主窗口的头文件需要  #include "子窗口头文件" 子窗口和父窗口之间相互切换 子窗口没有办法处理父窗口,子窗口此时就需要一个信号: * 信号必须有signal ...

  7. 我的代码-random forest

    # coding: utf-8 # In[1]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn.s ...

  8. 复习下CSS-零碎要点

    一,CSS选择器 1.  h1 > strong {color:red;}表示的是只有h1下子元素才是红色,“孙子”就不行. 2.  h1 + p {margin-top:50px;}   选择 ...

  9. AX3298添加新sensor

    这是编译的工程目录. 1,先把sensor对应的驱动比如GC1034.c添加到工程.然后编译成库.会在res目录下生产sensor.bin文件 流程:编译后在debug目录生成 elf 文件AX329 ...

  10. No matching authentication protocol

    java 连接oracle数据库: 之前连接公司的oracle数据库没有问题,但客户提供的是oracle12C版本的,连接就报 :No matching authentication protocol ...