使用xxl-job执行定时任务

文章目录

  • 使用xxl-job执行定时任务
    • xxl-job原理
    • 我们自己的项目里面需要怎么写定时任务呢?
    • 如果想要使用xxl-job我们需要在服务器上部署两个项目

使用xxl-job执行定时任务

xxl-job原理

首先xxl-job的全拼是“XiaoXiaoLiang Job”或者“Xu Xue Li”作者的名字,其核心设计理念是“开发迅速、学习简单、轻量级、易扩展”。通过Web界面,用户可以方便地管理任务,包括创建、更新、删除和查看任务运行状况。

xxl-job执行定时任务的原理是什么?
xxl-job执行定时任务的原理主要基于调度中心执行器的交互,利用数据库作为中间存储,通过时间轮算法精确触发任务,并支持分布式场景下的高可用和负载均衡。

xxl-job是一个轻量级分布式任务调度框架,旨在解决大规模任务调度问题。其核心架构分为调度中心和执行器两大部分。调度中心主要负责任务的管理和调度,而执行器则负责具体任务的执行。下面,从几个关键点来具体分析xxl-job的工作原理:

  • 调度中心:调度中心是整个xxl-job的核心,它本身是一个Web服务,主要功能包括任务的管理、调度配置以及监控和报警。调度中心依赖于数据库来存储所有任务的信息,这样即便调度中心的服务重启或者崩溃,任务信息也不会丢失。这种设计也使得调度中心可以水平扩展,通过数据库实现数据的一致性和共享。
  • 执行器:执行器实际上就是承载具体任务执行逻辑的服务。每个执行器都需要向调度中心注册,这样调度中心才能将任务分配给具体的执行器。执行器可以横向扩展,通过增加执行器的数量来提高任务处理能力。
  • 时间轮算法:为了保证任务能够在预定时间精确触发,xxl-job采用了时间轮算法。时间轮可以看作是一个由多个刻度组成的数组,每一个刻度代表一个时间点。当时间轮的指针走到某个刻度时,该刻度上的所有任务都会被触发并执行。这种算法确保了任务能够在精确的时间点被触发,并且能够高效地处理大量的定时任务。
  • 任务执行模型:xxl-job的任务执行模型非常灵活,支持多种触发策略,如Cron表达式、固定间隔、固定延时等。这些触发策略能够满足大多数业务场景的需求。同时,xxl-job还支持任务的动态修改和即时生效,这意味着可以在不重启服务的情况下,在线修改任务的状态和参数。

总的来说,xxl-job通过调度中心和执行器的分离,实现了任务调度与执行的解耦,提高了系统的灵活性和可扩展性。时间轮算法的应用确保了任务能够在预定时间准时触发,极大地提高了任务处理的效率。分布式和支持集群的特性使得xxl-job能够适应大规模、高并发的场景,非常适合现代企业对定时任务调度的需求。

可以把调度中心理解成xxl-job的管理中心,如下图:
在这里插入图片描述
对应的web页面如下图:
在这里插入图片描述

而执行器是什么呢?如下图:
在这里插入图片描述
看下执行器的配置如下图:
在这里插入图片描述
在我们实际的项目中(就是非xxl-job-admin任务调度中心项目,我们自己写的项目),需要写一个对应的执行器java类与其对应,如下图:
在这里插入图片描述
这里的执行器的配置信息必须与任务调度中心web界面中配置的保持一致,比如你可以发现appName的值都是my-first-timerTask,还有就是执行器的端口号都是8083;然后adminAddresses是我们的调度中心的地址;注意调度中心的端口号是和我们的执行器的端口号不一样的,不要重复了。

然后一个执行器可以执行多个定时任务,为了减轻执行器的负担,我们还可以横向扩展执行器,就是我们可以再加一些执行器,去执行不同的定时任务;

个人理解的xxl-job执行定时任务的原理?
xxl-job执行定时任务的原理是它会定时执行任务调度中心的任务执行器,如下图:
在这里插入图片描述
然后通过任务执行器关联到我们本地项目中的执行器,如下图:
在这里插入图片描述
这个时候我们本地项目其实已经就知道执行代码中的哪个方法了,为什么呢?因为我们的任务调度中心中已经告诉执行器它需要执行的定时任务是谁了,如下图:
在这里插入图片描述
比如我们上图中需要执行的任务的名字就是dataBackupJobHandler,然后就会去本地项目中找注解@XxlJob的值是这个的定时任务方法,如下图:
在这里插入图片描述

我们自己的项目里面需要怎么写定时任务呢?

首先引入xxl-job的依赖,如下:

<!-- XxlJobSpringExecutor任务执行器依赖 --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version></dependency>

然后写我们的任务使用的执行器,需要和xxl-job的web界面中的执行器保持一致,上面已经介绍过了;
接着在我们自己的项目中写我们想要执行的定时任务,比如我们现在是想执行一个日志定时任务,就是每隔10s输出一下日志信息,我们的定时任务要如何写呢?如下图:
在这里插入图片描述

/*** @author 望轩* @createDate 2024/7/23 16:35*/
@Component
public class DataBackupJobHandler {@XxlJob("dataBackupJobHandler")public ReturnT<String> execute(String param) throws Exception {// 在这里编写你的数据备份逻辑// 例如,将数据库中的数据导出到文件或云存储等System.out.println("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆我正在备份 份 份 儿啊!☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");return ReturnT.SUCCESS;}
}

至于控制定时任务每隔多少时间执行的cron表达式,我们需要在xxl-job的web界面中配置,如下图:
在这里插入图片描述
这里最关键的配置其实就有三个,一个是JobHandler属性,它是指定我们的定时任务的名字的,和我们java代码中的定时任务的名字一致,也就是上面java定时任务类中的@XxlJob注解的值;

第二个关键配置是Cron,这个主要是配置Cron表达式的,通过Cron表达式可以控制定时任务每隔多少时间执行一次;

最后一个关键配置是执行器,这里我们选择的是如下图:
在这里插入图片描述
它表示我们的定时任务将使用我们的这个定时任务执行器执行。一个执行器可以执行很多不同的定时任务,只要你的定时任务是选择的当前任务执行器,那么它就会被这个执行器执行;当我们一个任务执行器的负担太重,也就是执行的定时任务太多的时候,我们为了减轻负担,可以重新创建一个任务执行器。

如果想要使用xxl-job我们需要在服务器上部署两个项目

第一个项目肯定是我们自己的项目,这个项目里面有我们真正想要执行的定时任务方法;
第二个项目是xxl-job任务调度中心项目,这个项目是大众点评的许雪里开发的,是一个开源项目,可以去gitee上下载下来,地址连接:https://gitee.com/xuxueli0323/xxl-job?_from=gitee_search

下载完之后,它其实就是一个web项目,因此里面也有一些相关的数据库表,也需要我们在本地数据库里面创建下,如下图:
在这里插入图片描述

端口号设置:可以把xxl-job任务调度中心web项目的端口号设置为8080,任务执行器的设置为8083,你自己的项目也就是定时任务方法所在的那个项目端口号设置为8081;

最后看下定时任务执行结果,如下图:
在这里插入图片描述

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

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

相关文章

华清数据结构day4 24-7-19

链表的相关操作 linklist.h #ifndef LINKLIST_H #define LINKLIST_H #include <myhead.h> typedef int datatype; typedef struct Node {union{int len;datatype data;};struct Node *next; } Node, *NodePtr;NodePtr list_create(); NodePtr apply_node(datatype e); …

从零开始学Java(超详细韩顺平老师笔记梳理)06——面向对象编程基础(上):类与对象、成员方法、传参机制、对象克隆、递归(斐波那契、迷宫、汉诺塔、八皇后)

文章目录 前言一、类与对象1. 类与对象的概述2. 快速入门&#xff08;用面向对象的方式解决问题&#xff09;3. 对象在内存中的存在形式&#xff08;重要&#xff09;4. 属性5. 类与对象的内存分配机制 二、成员方法1. 基本介绍2. 快速入门3. 方法调用机制原理&#xff08;重点…

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户&#xff0c;包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为&#xff0c;需要提前获取用户授权&#xff0c;或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…

【JavaEE初阶】线程的概念及创建

目录 &#x1f4d5; 前言 &#x1f4d5; 认识线程&#xff08;Thread&#xff09; &#x1f6a9; 概念 &#x1f60a;线程是什么 &#x1f642; 为啥要有线程 &#x1f62d; 进程和线程的区别&#xff08;面试题重点&#xff09; &#x1f92d; Java的线程和操作系统线程…

MyBatis-Plus的基本使用(一)

目录 前言 特性 MyBatis-Plus入门案例 常用注解 小结 前言 这篇文章主要来学习MyBatis-Plus这个非常强大的框架. 在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#x…

Leetcode3216. 交换后字典序最小的字符串

Every day a Leetcode 题目来源&#xff1a;3216. 交换后字典序最小的字符串 解法1&#xff1a;模拟 找到第一个 s[i] > s[i 1]&#xff0c;且它们奇偶性相同&#xff0c;交换它们。 代码&#xff1a; /** lc appleetcode.cn id3216 langcpp** [3216] 交换后字典序最小…

Efficient and Effective Weakly-Supervised Action Segmentation via ATBA

**基于动作转移感知边界对齐的高效弱监督动作分割**介绍 动作分割的目的是将一个长的未裁剪的视频分割成几个片段&#xff0c;并将每个片段分类为一个动作类别&#xff0c;如下图所示&#xff1a; 弱监督动作分割 现有的训练方法大多需要通过对所有帧和文本进行序列比对来…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

笔记小结:现代卷积神经网络之批量归一化

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;&#xf…

Dav_笔记10:Using SQL Plan Management之3

将SQL计划基准与SQL Tuning Advisor一起使用 使用SQL Tuning Advisor调整SQL语句时&#xff0c;如果顾问程序找到调优计划并验证其性能优于从相应SQL计划基准中选择的计划&#xff0c;则建议接受SQL配置文件。 接受SQL配置文件后&#xff0c;数据库会将调整后的计划添加到相应…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

云仓如何改变传统仓储模式?

云仓&#xff0c;即云仓储&#xff0c;是一种基于互联网技术的现代仓储模式&#xff0c;与传统的仓储模式相比&#xff0c;它在多个方面进行了创新和优化&#xff0c;包括&#xff1a; ———————————————————— 1、数据管理与实时监控&#xff1a; 云仓储利…

Element-ui :el-table 中表尾合计行

Table 表格 | Element Plus <template><el-table :data"tableData" border show-summary :summary-method"getSummariesss" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

C++与lua联合编程

C与lua联合编程 一、环境配置二、lua基本语法1.第一个lua和C程序2.基本数据类型和变量2.1 Nil2.2 Booleans2.3 Numbers2.4 String(最常用) 3. 字符串处理3.1 错误处理3.2 字符串长度:string.len3.3 字符串子串 :string.sub3.4 字符串查找: string.find3.5字符串替换: string.gs…

【笔记】ubuntu 误退了搜狗输入法:终端上输入fcitx即可重启

有时候&#xff0c;我们可能嫌弃ubuntu上的搜狗输入法&#xff0c;点击了退出&#xff1a; 但是当我们想开启搜狗输入法时&#xff0c;发现它消失了&#xff0c;此时我们可以打开终端&#xff0c;键入&#xff1a; fcitx 即可成功开启。

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合

全国区块链职业技能大赛国赛考题前端功能开发

任务3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件login.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下: 具体要求如下: (1)有明确的提示,提示用户选择角色; (2)用户可看…

微服务安全——OAuth2详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

用51单片机或者stm32能否开发机器人呢?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;能的。但是由于单片机和st…

百度,有道,谷歌翻译API

API翻译 百度&#xff0c;有道&#xff0c;谷歌API翻译&#xff08;只针对中英相互翻译&#xff09;,其他语言翻译需要对应from&#xff0c;to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…