原理篇-- 定时任务xxl-job-服务端(admin)项目执行器注册执行器任务状态回调

文章目录

  • 前言
  • 一、执行器注册&执行器任务状态回调触发时机:
  • 二、服务端接收执行器和任务执行状态请求:
    • 2.1 JobApiController:
    • 2.2 AdminBiz 接口:
    • 2.3 AdminBiz 接口实现类AdminBizImpl:
    • 2.4 执行器注册:
    • 2.5 执行器的移除:
  • 总结


前言

在之前的章节中我们可以看到在 JobRegistryHelper 有执行器的注册和移除方法,JobCompleteHelper 有日志回调状态的更新,那么这些方法是何时被触发调用呢。


一、执行器注册&执行器任务状态回调触发时机:

  • 执行器注册&执行器任务: 是在在执行器项目启动和停止时分别向,服务端发送注册和移除注册请求;
  • 任务状态回调 是在执行器项目中由 TriggerCallbackThread类中的triggerCallbackThread 线程向服务端发送任务状态请求;

二、服务端接收执行器和任务执行状态请求:

2.1 JobApiController:

@Controller
@RequestMapping("/api")
public class JobApiController {@Resourceprivate AdminBiz adminBiz;/*** api** @param uri* @param data* @return*/@RequestMapping("/{uri}")@ResponseBody@PermissionLimit(limit=false)public ReturnT<String> api(HttpServletRequest request, @PathVariable("uri") String uri, @RequestBody(required = false) String data) {// valid 请求方式校验if (!"POST".equalsIgnoreCase(request.getMethod())) {return new ReturnT<String>(ReturnT.FAIL_CODE, "invalid request, HttpMethod not support.");}if (uri==null || uri.trim().length()==0) {return new ReturnT<String>(ReturnT.FAIL_CODE, "invalid request, uri-mapping empty.");}// 访问令牌校验if (XxlJobAdminConfig.getAdminConfig().getAccessToken()!=null&& XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length()>0&& !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) {return new ReturnT<String>(ReturnT.FAIL_CODE, "The access token is wrong.");}// services mappingif ("callback".equals(uri)) {// 日志回调callback 方法List<HandleCallbackParam> callbackParamList = GsonTool.fromJson(data, List.class, HandleCallbackParam.class);return adminBiz.callback(callbackParamList);} else if ("registry".equals(uri)) {// 执行器注册registryRegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);return adminBiz.registry(registryParam);} else if ("registryRemove".equals(uri)) {// 执行器移除registryRemoveRegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);return adminBiz.registryRemove(registryParam);} else {return new ReturnT<String>(ReturnT.FAIL_CODE, "invalid request, uri-mapping("+ uri +") not found.");}}}

2.2 AdminBiz 接口:

通过AdminBiz 接口最终调用服务端的实现类对数据进行处理。

public interface AdminBiz {// ---------------------- callback ----------------------/*** callback** @param callbackParamList* @return*/public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList);// ---------------------- registry ----------------------/*** registry** @param registryParam* @return*/public ReturnT<String> registry(RegistryParam registryParam);/*** registry remove** @param registryParam* @return*/public ReturnT<String> registryRemove(RegistryParam registryParam);// ---------------------- biz (custome) ----------------------// group、job ... manage}

2.3 AdminBiz 接口实现类AdminBizImpl:

@Service
public class AdminBizImpl implements AdminBiz {// 日志回调@Overridepublic ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {return JobCompleteHelper.getInstance().callback(callbackParamList);}// 执行器注册@Overridepublic ReturnT<String> registry(RegistryParam registryParam) {return JobRegistryHelper.getInstance().registry(registryParam);}// 执行器移除@Overridepublic ReturnT<String> registryRemove(RegistryParam registryParam) {return JobRegistryHelper.getInstance().registryRemove(registryParam);}}

2.4 执行器注册:

public ReturnT<String> registry(RegistryParam registryParam) {// valid  参数验证if (!StringUtils.hasText(registryParam.getRegistryGroup())|| !StringUtils.hasText(registryParam.getRegistryKey())|| !StringUtils.hasText(registryParam.getRegistryValue())) {return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");}// async executeregistryOrRemoveThreadPool.execute(new Runnable() {@Overridepublic void run() {/*** <update id="registryUpdate" >UPDATE xxl_job_registrySET `update_time` = #{updateTime}WHERE `registry_group` = #{registryGroup}AND `registry_key` = #{registryKey}AND `registry_value` = #{registryValue}</update>**/// 更新执行器注册地址int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());if (ret < 1) {// 如果没有更新成功,说明是第一次注册,则进行插入/*** INSERT INTO xxl_job_registry( `registry_group` , `registry_key` , `registry_value`, `update_time`)VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, #{updateTime})**/XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());// freshfreshGroupRegistryInfo(registryParam);}}});return ReturnT.SUCCESS;
}

2.5 执行器的移除:

public ReturnT<String> registryRemove(RegistryParam registryParam) {// validif (!StringUtils.hasText(registryParam.getRegistryGroup())|| !StringUtils.hasText(registryParam.getRegistryKey())|| !StringUtils.hasText(registryParam.getRegistryValue())) {return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");}// async executeregistryOrRemoveThreadPool.execute(new Runnable() {@Overridepublic void run() {// 移除执行器/*** <delete id="registryDelete" >DELETE FROM xxl_job_registryWHERE registry_group = #{registryGroup}AND registry_key = #{registryKey}AND registry_value = #{registryValue}</delete>**/int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());if (ret > 0) {// fresh 移除成功freshGroupRegistryInfo(registryParam);}}});return ReturnT.SUCCESS;
}

总结

本文对服务端项目执行器注册&执行器任务状态回调 调用时机进行介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

长电科技斥资45亿元收购晟碟半导体80%股权

2024年3月3日&#xff0c;西部数据公司旗下间接全资子公司SanDisk中国有限公司与长电科技有限公司&#xff08;JCET集团有限公司的全资子公司&#xff09;签订了股权购买协议。根据协议&#xff0c;SanDisk中国将向JCET出售其间接全资子公司、在中国注册成立的外商独资有限责任…

如何把已安装的nodejs高版本降级为低版本

第一步.先清空本地安装的node.js版本 按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 然后进入命令控制行窗口&#xff0c;并输入where node查看之前本地安装…

HTML(基本标签)

HTML标签 <div>div标签</div> <span>这是一个span标签</span> <p>段落标签</p> 图片标签 --相对路径 <img src"../images/手.bmp/" alt"图像显示不出来的时候用文字替换" title"这是一个提示文本"…

android开发游戏加速器,Android架构组件Room功能详解

Java基础 Java Object类方法HashMap原理&#xff0c;Hash冲突&#xff0c;并发集合&#xff0c;线程安全集合及实现原理HashMap 和 HashTable 区别HashCode 作用&#xff0c;如何重载hashCode方法ArrayList与LinkList区别与联系GC机制Java反射机制&#xff0c;Java代理模式Jav…

【Spring Cloud原理详解】介绍

Spring Cloud Spring Cloud基于Spring Boot提供了在分布式系统&#xff08;如配置管理、服务发现、断路器、智能路由、微代理、控制总线&#xff09;中常见模式的一站式解决方案&#xff0c;Spring Cloud使用了Spring Boot的开发便利性&#xff0c;简化了分布式系统基础设施的…

dolphinescheduler调用API

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 打开api文档 api文档地址&#xff1a;http://{api server ip}:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn&#xff0c;我是用k8s部署的&#xff0c;所以ip和端口是由service决定的&#xf…

Spring MVC 面试题及答案整理,最新面试题

Spring MVC中的DispatcherServlet是什么&#xff0c;它如何工作&#xff1f; DispatcherServlet是Spring MVC中的核心组件&#xff0c;负责协调不同的请求处理器。它的工作流程包括&#xff1a; 1、请求接收&#xff1a; 接收HTTP请求&#xff0c;并将其转发到相应的处理器。…

鱼哥赠书活动第⑩期:一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

鱼哥赠书活动第⑩期&#xff1a; 内容简介&#xff1a;作者简介&#xff1a;读者对象&#xff1a;直播预告&#xff1a;购书链接&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c…

【Python 识别某滑块的距离】今天来换思维搞滑块,不用识别库,几行代码就能搞定,仅供学习

写作日期&#xff1a;2024.03.05 使用工具&#xff1a;Python 温馨提示&#xff1a;此方法仅对有完整图和缺口图的滑块有效&#xff0c;可精准识别出缺口要滑动的距离 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES处理&#xff08;直接…

SpringCloud之OpenFeign入门与实战系列

目录 一、什么是 OpenFeign? 1.1 OpenFeign 功能升级 二、OpenFeign超时重试机制 2.1 超时重试机制 2.2 自定义超时重试机制 2.2.2 自定义超时重试类 2.3 OpenFeign 超时重试的底层原理 一、什么是 OpenFeign? OpenFeign 的全称为 Spring Cloud OpenFeign(下文简称 Op…

[Uniapp]携带参数跳转界面(两种方法)

一、方法1&#xff1a;路由携参 假设现在有两个界面&#xff1a;界面A和界面B。并要由界面A跳转到界面B&#xff0c;则我们可以使用 uni.navigateTo({}) 跳转界面时&#xff0c;将参数附加在URL后&#xff0c…

newSingleThreadExecutor和newFixedThreadPool(1)的区别

维护仅有一个线程的线程池有如下两种方式&#xff0c;正常使用的情况下&#xff0c;二者差异不大&#xff1b;复杂使用环境下&#xff0c;二者存在细微的差异。用newSingleThreadExecutor方式创建的线程池在任何时刻至多只有一个线程&#xff0c;因此可以理解为用异步的方式执行…

Android中 在目录下创建文件的权限添加 流程

Android中读写目录涉及到的权限一般有三个&#xff0c;一个是selinux, 另一个是用户组, 还有一个是目录本身权限问题&#xff0c;本文章针对这三点做详细解析 目录 一: Selinux权限问题 1: 先查看进程SSSPID的标签 2: 再查看要访问的目录的标签 二: 被访问目录本身权限问…

《剑指offer》14--剪绳子(整数拆分)[C++]

目录 题目描述 贪心算法 输出结果 题目描述 把一根绳子剪成多段&#xff0c;并且使得每段的长度乘积最大。 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释:…

Android开发技术总结,附项目源码

今天本文主要讲解&#xff1a; APK文件反编译 什么是反编译如何防止反编译APK文件的基本构造 APK加固的方案原理 APK加固总体架构APK打包基本流程Dex文件的意义 AES加密项目实战 APK加固项目实战APK脱壳技术实战 一.APK文件反编译 1.什么是反编译 定义&#xff1a; 利用…

Java后端核心——Servlet

目录 一.概述 二.基础实现 1.导入坐标 2.定义实现类 3.注解 4.访问Servlet 三.执行流程 四.生命周期 1.加载和实例化 2.初始化 3.请求处理 4.服务终止 五.方法 1.init 2.service 3.destroy 4.getServletInfo 5.getServletConfig 六.体系结构 七.urlPatter…

第二节 JDBC SQL语法

结构化查询语言(SQL)是一种标准化语言&#xff0c;允许对数据库执行操作&#xff0c;例如&#xff1a;创建数据记录&#xff0c;读取内容&#xff0c;更新内容和删除数据记录等。 本教程中将概述SQL&#xff0c;这是了解和学习JDBC概念的前提条件。 经过本章后&#xff0c;您将…

【C++】7-1 简单加法 分数 15

7-1 简单加法 分数 15 全屏浏览 切换布局 作者 刘利 单位 惠州学院 编写add函数&#xff0c;通过函数重载&#xff0c;实现对变量num&#xff0c;增加值n。num增加n的规则如下&#xff1a; 如果num和n都是数值&#xff0c;则num的值变为numn。 如果num为字符&#xff0c;…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能&#xff1a; 提供用户名和密码输入框。当用户提交表单时&#xff0c;阻止默认提交行为。使用正则表达式验证用户输入的内容&#xff0c;判断输入的是有效的邮箱地址还是身份证号码。根据验证结果&#xff0c;在输入框下方显示相应的提示信息。 实现逻辑&a…

ZYNQ--PS_PL交互(AXI_HP)

AXI_HP接口 通过AXI_HP接口,可直接通过AXI_FULL协议向DDR中通过DMA传输数据。 BD设计 AXI_HP接口设置 AXI_Master代码 module axi_full_master #(parameter C_M_TARGET_SLAVE_BASE_ADDR = 32h40000000,parameter integer C_M_AXI_BURST_LEN = 16,parameter integer …