xxl-job的使用

介绍

  在分布式中,很多微服务可能存在多实例部署的现象,如果在某个具体的微服务中实现一个定时任务,而该微服务存在多个实例的话,那么会导致该定时任务在不同实例中都会进行执行!这很容易导致脏数据、数据重复等问题,因此在通过微服务实现定时任务时并不能像spring boot那样简单。具体实现思路存在两种:

  • 分布式锁,一旦存在实例中的一个定时任务执行,则抢占该分布式锁,其他实例的定时任务当抢占不到该锁时则不进行后续执行;
  • 调动中心:采用调度中心调度定时任务的执行,可以方便的实现修改调度策略,实现功能上的解耦。XXL-JOB就是这种调度中心;

  XXL-JOB的官网学习地址:https://www.xuxueli.com/xxl-job/#《分布式任务调度平台XXL-JOB》

  在XXL-JOB中存在两个组件:调度中心和执行器;想要明白什么时调度中心和执行器首先需要简单逻辑XXL-JOB的定时任务执行策略,为了应对分布式定时任务执行,XXL-JOB将任务调度逻辑单独抽取出来实现了一个调度中心,调度中心只负责任务的调度,任务的具体执行是由执行器进行负责的,也就是说:调度中心根据任务执行策略,在满足任务执行的条件下调度某个实例或者所有实例进行执行,当满足执行条件时,调度中心将发送给执行器一条消息,告诉执行器需要进行执行某项作业。

  调度中心:一个spring boot项目,可以维护任务执行策略以及一部分任务执行内容,例如可以将执行具体内容维护到调度中心【更新数据的源码】,虽然调度中心可以维护执行源码,但具体的执行过程中并不是调度中心进行,调度中心仅仅负责按照执行策略将命令信息发送给执行器;

  执行器:可以是一个单独的项目也可以集成到业务项目中,任务的具体执行单位,接收到调度中心的消息后,会将消息进行解析并执行,如果调度中心的消息是一段源码,则执行器将对源码进行编译并进行执行。

  通过上述描述,不难看出调度中心和执行器的分工不同,这种设计的模式可以将执行过程和调度过程有效分离,避免不同执行器对调度中心的干扰,有效实现调动中心的解耦。

调度中心部署

  根据介绍内容可知,xxl-job的部署可以分为调度中心的部署和执行器的部署两部分进行。由于调度中心是一个单独的spring boot项目,因此我们已将其进行单独部署到服务器中,本文中不说明调度中心的集群部署方式,仅针对单体部署进行简单说明。在这里我采用docker部署,具体命令如下:

/**
* 如需自定义 mysql 等配置,可通过 "-e PARAMS" 指定,参数格式 PARAMS="--key=value  --key2=value2" ;
* 配置项参考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
* 如需自定义 JVM内存参数 等配置,可通过 "-e JAVA_OPTS" 指定,参数格式 JAVA_OPTS="-Xmx512m" ;
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:{指定版本}
该命令部署时需要生命mysql连接信息、mysql用户名、密码,以及xxl.job.accessToken属性,该属性的值在后续执行器的实现过程中需要被使用到。

  上述命令采用了docker部署,调度中心是一个单独的spring boot项目,为了持久化用户配置,该项目使用到了mysql进行配置信息存储,因此,在部署调度中心的过程中需要配置mysql的连接信息,上述是官网提供的部署方案,为了更加灵活的实现配置自定义,还可以将xxl-job中的配置文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties 进行挂载出来,然后配置修改自己的相关配置。执行命令如下:

docker run -p 8080:8080 -e PARAMS="--spring.config.location=/application.properties" -v /tmp:/data/applogs [自己的application.properties配置文件地址]:/APPLICATION.PROPERTIES  --name xxl-job-admin  -d xuxueli/xxl-job-admin:{指定版本}

  通过上述配置完成调度中心容器启动后,可以通过http://localhost:8081/xxl-job-admin/toLogin进行调度中心登录,默认登录账号 “admin/123456”。运行界面如下

在这里插入图片描述
  至此,调度中心完成配置,刚才我们说到,调度中心需要自己的mysql数据库,如果调度中心无法运行,则我们可以尝试创建一个数据库,相关信息需要和配置文件保持一直。

执行器

  执行器可以集成到我们的业务项目中,也可以单独的部署成为一个微服务,在这里我采用单独部署微服务的方式进行实现:在执行器微服务的实现过程中我们首先需要创建一个分布式微服务项目,因为后续执行器的具体执行可以会依赖于spring boot、spring clound、openfeign等架构。在构建完成微服务后,引入以下依赖:

        <!-- xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.0</version>
        </dependency>

配置xxl-job执行器

/**
 * xxl-job 执行器配置
 */
@Configuration
public class XxlJobConfig {
	// 调度中心的地址
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    // 自定义执行器的名称
    @Value("${xxl.job.executor.appname}")
    private String appName;
    // 日志输入地址
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    // 日志留存时间
    @Value("${xxl.job.executor.logretentiondays}")
    private int logretentiondays;
    // 格外注意:授权token需要和调度中心配置文件中设置的相同
    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appName);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logretentiondays);
        return xxlJobSpringExecutor;
    }
}

  在启动执行器之前,我们还需要再调度中心中配置执行器,否则执行器不能正常注册到调度中心中,配置界面如下:
在这里插入图片描述
  配置信息完成后,启动执行器,上线机器地址即可查看到我们刚刚启动的执行器。

任务的配置

  在定时任务的实现过程中我们可以按照如下流程进行:执行器中实现业务逻辑代码,可以通过openfeign进行给个微服务的调用;调度中心中在任务中心管理界面中新增任务,具体流程如下:

  • 执行器实现业务代码,并把入口定义为一个service的方法,该service需要通过@Service注解交由bean容器执行
  • 调度中心任务管理界面新增任务,任务配置运行模式选择java,如下
    在这里插入图片描述
  • 保存后通过ide编写执行代码:
    在这里插入图片描述
  • 在代码的编写过程中我们可以使用@Autowired实现bean容器中的bean的依赖注入;建议首先使用idea编译器实现一版后辅助到调度中心中。如果运行的任务需要进行入参配置,还可以配置方法的参数等相关信息。

总结

  本文主要简单描述了xxl-job从搭建到使用的基本过程,很多细节及原理问题并未进行深究,设计内容及主要注意事项有一些方面:

  • 调度中心和执行器是分开部署的,调度中心和执行器需要使用相同的accessToken否则执行器无法注册到调度中心中
  • 调度中心部署的过程中需要生命数据库相关信息
  • 不同执行器微服务的appname不能相同
  • 在调度中心进行配置执行器代码的过程中可以使用到依赖注入等spring 特性
  • 执行器的具体执行工作可以使用自身业务逻辑+openfeign的形式进行实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑白群晖激活AME(Advanced Media Extention)

黑群晖激活Advanced Media Extensions&#xff08;AME&#xff09;解码HEVC视频和HEIC图片 声明&#xff1a;此教程在正版群晖系统中进行的操作&#xff0c;虽然也能用于非正版系统中AME的安装&#xff0c;但是在非正版系统中安装AME属于破解行为&#xff0c;对系统造成的影响和…

安装vllm的时候卡主:Collecting vllm-nccl-cu12<2.19,>=2.18 (from vllm)

按照vllm的时候卡主&#xff1a; ... Requirement already satisfied: typing-extensions in /home/wangguisen/miniconda3/lib/python3.10/site-packages (from vllm) (4.9.0) Requirement already satisfied: filelock>3.10.4 in /home/wangguisen/miniconda3/lib/python…

落地台灯有什么作用?五款口碑好的落地台灯推荐

落地台灯有什么作用&#xff1f;面对长时间工作、学习已成为当代年轻人的真实写照&#xff0c;据目前不完全统计&#xff0c;60%以上的人群每天用眼时间都已经超过10小时&#xff0c;高强度的的用眼以及不可确定的环境因素都易导致双眼出现干涉、酸痛、红血丝等情况&#xff0c…

SpringBoot 七牛云 OSS 私有模式 获取访问链接

目录 一、问题引出 二、在SpringBoot中获取私有访问路径的操作 一、问题引出 由于七牛云OSS的公有模式存在被盗刷的风险&#xff0c;可能导致服务器额外的费用&#xff0c;于是我选择私有模式进行操作。私有模式的访问路径是一个问题&#xff0c;因为需要对应着token和e这两…

MyBatis系统学习篇 - 分页插件

MyBatis是一个非常流行的Java持久层框架&#xff0c;它简化了数据库操作的代码。分页是数据库查询中常见的需求&#xff0c;MyBatis本身并不直接支持分页功能&#xff0c;但可以通过插件来实现&#xff0c;从而帮助我们在查询数据库的时候更加方便快捷 引入依赖 <dependen…

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…

LeetCode84:柱形图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 代码 单调栈 class Solution { public:int largestRectangleArea(vector<int>& h…

【数据结构】链表与顺序表的比较

不同点&#xff1a; 顺序表和链表是两种常见的数据结构&#xff0c;他们的不同点在于存储方式和插入、删除操作、随机访问、cpu缓存利用率等方面。 一、存储方式不同: 顺序表&#xff1a; 顺序表的存储方式是顺序存储&#xff0c;在内存中申请一块连续的空间&#xff0c;通…

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…

字符串-最长回文子串

一、题目描述 二、解题思路 设置双指针&#xff0c;定位连续子串&#xff0c;这里提供暴力解法&#xff0c;枚举各种子串并判断子串是否符合回文特征&#xff0c;符合则更新最长子串长度。 主要是注意一下java相关的语法API&#xff1a; 1.使用 (new StringBuilder(substr))…

MongoDB~存储引擎了解

存储引擎 存储引擎是一个数据库的核心&#xff0c;主要负责内存、磁盘里数据的管理和维护。 MongoBD的优势&#xff0c;在于其数据模型定义的灵活性、以及可拓展性。但不要忽略&#xff0c;其存储引擎也是插件式的存在&#xff0c;支持不同类型的存储引擎&#xff0c;使用不同…

B-TREE教程(个人总结版)

背景 在计算机科学中&#xff0c;数据存储和检索的效率是一个重要的研究课题。B-树&#xff08;B-Tree&#xff09;作为一种自平衡树结构&#xff0c;特别适合于在磁盘存储中处理大规模数据。它通过保持树的高度平衡&#xff0c;使得搜索、插入和删除操作的时间复杂度保持在对…

docker查看容器目录挂载

查看命令 docker inspect --format{{ json .Mounts }} <container_id_or_name> | jq 示例 docker inspect --format{{ json .Mounts }} af656ae540af | jq输出

Linux远程连接失败(Linux与Windows相互可以ping)

Linux远程连接解决办法记录 目录 文章目录 Linux远程连接解决办法记录1.SSH没有开启1.1查询ssh进程 1.SSH没有开启 sudo apt install openssh-serversudo /etc/init.d/ssh resart1.1查询ssh进程 ps -e | grep ssh 重新尝试连接

USB - D+/D-信号介绍

USB &#xff08;通用串行总线&#xff09;信令包括两条数据线 D 和 D-&#xff0c;用于差分信令&#xff0c;以提高抗噪能力和数据完整性。这些线路的控制决定了 USB 通信中的数据传输、各种状态和信号协议。 USB 差分信号 差分信号是指数据由 D 和 D- 线路之间的电压差来表…

【C++进阶】深入STL之string:掌握高效字符串处理的关键

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. STL基本…

Java版本家政上门系统源码,自主研发、安全可控,支持任意二次开发

家政上门系统源码&#xff0c;Java版本&#xff0c;自主研发、安全可控。支持任意二次开发、有丰富合作案例。多端管理&#xff1a;管理端、用户端、服务端。 技术参数&#xff1a; 技术架构&#xff1a;springboot、mysql 、Thymeleaf 开发语言&#xff1a;java1.8、vue 开…

【智能AI相机】基于AI的新型成像和照明技术

缩短检测时间 降低废品率和成本 更快捕捉更多缺陷 ” Trevista CI Dome将康耐视专利的计算成像算法与结构化漫射圆顶照明相结合&#xff0c;提供无与伦比的地形图像质量&#xff0c;为光泽和哑光表面检测提供创新解决方案。有助于&#xff1a;缩短检测时间、降低废品率和成本…

通俗易懂->哈希表详解

目录 一、什么是哈希表&#xff1f; 1.1哈希表长什么样&#xff1f; 1.2为什么会有哈希表&#xff1f; 1.3哈希表的特点 1.3.1 取余法、线性探测 1.3.2 映射 1.3.3负载因子 1.4哈希桶 1.5闲散列与开散列 1.6总结 二、设计hash表 1、哈希表的设计 1&#xff09;插入…

ChatGPT在工作中的使用案例

知识点提示 开发过程中&#xff0c;遇到某个知识点&#xff0c;忘记或者不清楚怎么使用了&#xff0c;通过ChatGPT快速生成使用提示和案例。代码库“字典” 比如C 11 判断数组所有元素为false 在 C11 中&#xff0c;可以使用标准库中的 all_of 算法来判断数组中的所有元素是…