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;@Beanpublic 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的形式进行实现

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

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

相关文章

远程继电器模块实现(nodemcu D1 + 继电器)

前言 接下来将实现一个远程继电器&#xff0c;实时远程控制和查询的开关状态。用 5v 直流电控制 220v 交流电。 硬件上&#xff1a; 使用 nodemcu D1 和 JQC-3FF-S-Z 继电器。 软件上&#xff1a; 使用 nodejs 作为服务端&#xff0c;和 html 作为客户端。 在开始之前在电脑…

Scrapy vs. Beautiful Soup | 网络抓取教程 2024

网络爬虫是任何想要从网上收集数据用于分析、研究或商业智能的人必备的技能。Python中两个最受欢迎的网络爬虫工具是Scrapy和Beautiful Soup。在本教程中&#xff0c;我们将比较这些工具&#xff0c;探索它们的功能&#xff0c;并指导你如何有效地使用它们。此外&#xff0c;我…

精雕细琢,B 端 UI 设计展典雅风范

精雕细琢&#xff0c;B 端 UI 设计展典雅风范

CC工具箱使用指南:【山西省村规结构调整表(亦求长生亦求你)】

一、简介 群友定制工具。 工具根据输入的用地图层&#xff0c;生成山西村规的结构调整表。 和一般的用地表有些不一样的地方是&#xff0c;现状和规划字段都在同一个图层里。 并且还有一个【村庄名称】的字段&#xff0c;可以将多个村庄放在一个图层中&#xff0c;一次性生…

【网络研究观】-20240531

战争揭开美国武器优势的面纱 随着俄军在哈尔科夫地区稳步推进&#xff0c;乌克兰战争对美国国防机器而言是一场灾难&#xff0c;这一点越来越明显&#xff0c;这不仅是因为我们的援助未能挽救乌克兰的撤退和可能的失败。更重要的是&#xff0c;这场战争无情地暴露了我们国防体…

Nginx一个端口代理多个vue项目,通过不同路由转到不同系统,反向代理Apache进行文件处理

需求&#xff1a;由于一些因素限制&#xff0c;需要尽可能的少开放外部端口访问&#xff0c;这里将多个vue项目通过一个nginx端口进行代理&#xff0c;由不同的路由来确定访问哪些项目&#xff0c;apache同理 nginx代理多个vue项目 安装和配置nginx的基础教程这里就不写了&…

thinkphp6 queue队列的maxTries自定义

前景需求&#xff1a;在我们用队列的时候发现maxtries的个数时255次&#xff0c;这个太影响其他队列任务 我目前使用的thinkphp版本是6.1 第一部定义一个新的类 CustomDataBase&#xff08;我用的mysql数据库存放的队列&#xff09; 重写__make 和createPlainPayload方法 …

前端功能拖拽篇:dragleave拖拽事件穿透子元素的优雅解决方案

文章目录 前情提要应用场景⭐拖拽改变元素位置⭐拖拽改变目标区域的样式⭐dragleave拖拽事件穿透子元素的优雅解决方案 最后 前情提要 在前端工作过程中&#xff0c;避免不了要接触各种技术&#xff0c;拖拽就是其中一个&#xff0c;大部分关于拖拽的基础知识和Demo都在MDN中写…

day-36 删除链表的倒数第 N 个结点

思路 首先计算出链表的长度&#xff0c;然后删除第n个节点即可&#xff0c;但要注意考虑特殊情况 解题方法 特殊情况&#xff1a;1.删除节点为最后一个节点 2.删除节点为头结点 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* …

Go-知识并发控制Context

Go-知识并发控制Context 1. 介绍2. 实现原理2.1 接口定义2.2 Deadline()2.3 Done()2.4 Err()2.5 Value() 3. 空 context4. cancelCtx4.1 Done()4.2 Err()4.3 cancel()4.4 WithCancel4.5 例子4.6 总结 5. timerCtx5.1 Deadline5.2 cancel5.3 WithDeadline5.4 WithTimeout5.5 例子…

HTML+CSS+JS 熊猫登录表单

效果演示 实现了一个可爱的熊猫登录界面,页面背景使用了渐变色,熊猫的头部和身体使用了圆形和椭圆形的边框,使用了CSS的伪元素和阴影效果来实现熊猫的手和脚。登录框使用了flex布局,包括用户名和密码的输入框和登录按钮,使用了CSS的过渡效果和伪类来实现输入框的动态效果。…

【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值

【LeetCode刷题】Day 13 题目1&#xff1a;852.山脉数组的峰顶索引思路分析&#xff1a;思路1&#xff1a;暴力枚举O(N)思路2&#xff1a;二分查找O(logN) 题目2&#xff1a;162.寻找峰值思路分析&#xff1a;思路1&#xff1a;二分查找O(logN) 题目1&#xff1a;852.山脉数组的…

(二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2

层序遍历 10 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 综合代码&#xff1a; class Solution{public List<List<Integer>> resList new ArrayList<List<Integer>>();public List<List<…

24年海南三支一扶报名流程步骤详解

一、考试时间安排&#xff1a; 报名时间&#xff1a;6月1日8:00至6月7日18:00 准考证打印时间&#xff1a;6月17日8:00 考试时间&#xff1a;6月22日 二、招聘人数 海南省计划招募390名高校毕业生 三、笔试内容&#xff1a; 笔试内容&#xff1a;综合能力和素质&#xff08;满分…

【设计模式】JAVA Design Patterns——Iterator(迭代器模式)

&#x1f50d;目的 提供一种在不暴露其基础表示的情况下顺序访问聚合对象的元素的方法。 &#x1f50d;解释 真实世界例子 百宝箱包含一组魔法物品。有多种物品&#xff0c;例如戒指&#xff0c;药水和武器。可以使用藏宝箱提供的迭代器按类型浏览商品。 通俗描述 容器可以提供…

【AIGC-数字人】V-Express:渐进式训练的数字人视频生成技术

介绍 在人像视频生成领域&#xff0c;使用单张图像生成人像视频已经变得越来越普遍。一种常见的方法涉及利用生成模型来增强适配器以实现受控生成。然而&#xff0c;控制信号的强度可能会有所不同&#xff0c;包括文本、音频、图像参考、姿态、深度图等。其中&#xff0c;较弱的…

Vue.js - 生命周期与工程化开发【0基础向 Vue 基础学习】

文章目录 Vue 的生命周期Vue 生命周期的四个阶段Vue 生命周期函数&#xff08;钩子函数 工程化开发 & 脚手架 Vue CLI**开发 Vue 的两种方式&#xff1a;**脚手架目录文件介绍项目运行流程组件化开发 & 根组件App.vue 文件&#xff08;单文件组件&#xff09;的三个组成…

LeetCode 图-岛屿问题

图 图的基本知识基本概念图的类型相关术语 图的存储 LeetCode 相关题目岛屿问题岛屿的最大面积岛屿的周长 图的基本知识 基本概念 图的类型 无向图有向图加权图 相关术语 顶点边路径路径长度环负权环连通性顶点的度入度出度 图的存储 邻接矩阵存储&#xff1a;是用一个二…

真机调试 Error:系统错误,xxx exceed max limit 2MB

我们在使用微信开发者工具开发小程序、小游戏等应用时&#xff0c;往往会点击“真机调试”&#xff0c;微信扫描查看真实情况。 但是会出现下面的报错提示&#xff0c;是因为主包体积超过了2MB。 小程序有体积和资源加载限制&#xff0c;在微信小程序中&#xff0c;每个包不能…

vue3简单快速实现主题切换功能

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《vue3实战》 目录 内容概要 实现步骤 1.定义不同主题的css样式变量 2.入口main.ts中引入这个样式文件 3.主题样式css变量引用 4.设置默认主题样式 5.实现点击按钮主题切换 总结 最近发现了一个巨牛的人工智…