【含完整代码】Java定时任务之xxl-job[超详细]

news2025/4/23 11:52:44

前言

个人博客:www.wdcdbd.com

 在Java中使用定时任务是一件很常见的事情,比如使用定时任务在什么时间什么时候,去发布一些信息,或者去查询一些日志等相关的代码。这时,我们就要开发定时任务这中功能来实现此案例。而Java常见的定时任务一般有6种,JDK自带Timer实现,Quartz框架集成实现spring自带的Spring Task等  剩下的就不说了,具体想要了解可以去百度搜索,而今天要讲的是Java定时任务神器: xxl-Job——轻量级分布式任务调度平台。

XXl-Job 

 开源xxl-job: https://gitee.com/xuxueli0323/xxl-job

XXL-JOB是一个轻量级分布式任务调度平台。特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展。由调度中心和执行器功能完成定时任务的执行。调度中心负责统一调度,执行器负责接收调度并执行。

因为此文章是针对小白来讲述的,所以会使用大量的图片和代码,以便讲的更加详细易懂,所以会有很多小废话。话不多说,直接上代码讲解。

一、Gitee下载开源框架XXl-job

1、拉取xxl-job代码

首先去上述的gitee拉取开源的xxl-job代码,千万不要选择master分支,要选择稳定的版本,这里我选择2.2.0来做演示。

去自己的idea中拉取gitee

 拉取好之后,就是下述图片的样式,其中最主要的内容就是admin,等到最后,我会单独讲解xxl-job框架中所有的相关内容都是什么意思。现在先按照步骤做即可

二、在使用xxl-job时所以要了解的知识(重要)

1、所要了解的知识

xxl-job共分为3大部分:任务调度器平台、任务执行器、任务处理器(jobHandler)、

任务调度器平台: 就是上述拉取下来的代码中的xxl-job-admin项目,这个项目就是任务调度平台。我们只需要配置一下就可以有自己的一个平台环境。而这个人任务调度器平台我们就可以理解为eureka(注册中心)

任务执行器执行任务处理器

任务处理器(jobHandler):通过自己在项目中自定义不同的任务处理器来让任务执行器执行,并通过调度器平台 处理不同的任务。

现在看不懂没事,等后续搭建起来之后,你就会全部理解。 

三、搭建任务调度器平台 

1、任务调度器平台

1.1、创建xxl-job-admin数据库

将这个.sql文件创建到你的数据库中,这个应该都会创建,数据库名字要为xxl_job防止不必要的错误。其实里边已经帮你写好了,这里我就以Navicat为例引入.sql文件

将.sql复制粘贴到桌面,然后通过Navicat引入即可。

1.2、配置yaml

首先去xxl-job-admin找到配置文件,并修改portmysqlmailxxl.job.accessToken

修改port

修改mysql

修改mail

邮箱的账号密码不知道的去百度搜索:java配置mail 

修改 xxl.job.accessToken

这个accessToken可以理解为秘钥,后面会在你自己的项目中配置和他名字一模一样的秘钥,让你的项目与任务调度器平台互相关联起来。

这里我就不做修改了,使用默认的,可以自定义。

1.3、配置logback.xml

路径可以自定义,我就放到我习惯的位置,你也可以放到你自己习惯的位置

在linux中先创建好自己的路径日志,然后赋权限,下面的命令,是给文件赋权限的

chmod -R 777 /home/dblog/xxl-job/xxl-job-admin.log

 1.4、启动任务调度器

配置好之后,用idea打包,并将jar在linux中运行。

1.4.1、修改jar名称

 我将xxl-job-admin-2.4.1-SNAPSHOT放到自己习惯的位置并修改了名称(个人习惯),不修改也可以。

#将jar通过后台进程启动,并将启动信息指向xxl-job-admin.log中  

nohup java -jar xxl-job-admin.jar > xxl-job-admin.log 2>&1 &

#查看日志

tail -f xxl-job-admin.log

 1.5、访问任务调度器
访问地址:http://自己的ip:自己设置的端口号/xxl-job-admin    

账号:admin  ;密码:123456

 好的!以上就是搭建好的xxl-job的调度器平台了,现在我们只需要在自己的项目中引入xxl-job依赖,然后配置一些东西,就可以在这个任务调度器平台来操作定时任务啦!!!

四、sprintboot引入xxl-job

1、引入xxl-job-core依赖

在自己的项目中引入xxl-job-core依赖;只需引入这一个依赖就行

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

 2、配置yaml

在自己的项目中配置yaml

xxl:
  job:
    admin:
      # 调度中心服务部署的地址
      addresses: http://192.168.139.110:9000/xxl-job-admin
    # 执行器通讯TOKEN,要和调度中心服务部署配置的accessToken一致,要不然无法连接注册
    accessToken: default_token
    executor:
      # 执行器AppName
      appname: job-demo
      # 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
      address:
      ip: 192.168.139.110
      #执行器端口号:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
      port: 9999
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logpath: /home/dblog/log/jobhandler
      # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
      logretentiondays: 30

注意!!!!: logpath执行日志存储位置,也是需要自己在linux中创建的,和上述任务调度器平台创建一样,创建完成之后,设置权限。 

3、配置日志 

去你拉取的xxl-job项目中找到 logback.xml,复制到你自己项目的位置

复制到自己的项目中

3.1、修改日志路径

在linux创建,并且给权限,这个就偷下懒不写了,在任务调度平台中已经写过了,可以模仿写一下。

4、编写配置类

原封不动复制粘贴到你项目的位置就行即可,我一般习惯放到config下。这个配置类其实是可以在xxl-job项目中找到的。

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

xxl-job项目中的XxlJobConfig

上述的配置类代码,其实就是这个xxl-job项目中的XxlJobConfig  一模一样。 

 

 5、创建任务处理器类

将xxl-job中的SampleXxlJob复制到自己的项目中

 5.1、修改并编写代码

全部配置好之后,将自己的项目打包并部署到linux中,可以看到我的项目已经起来了。

接下来,就要去操作任务调度器平台了,来设置定时任务。

五、操作任务调度器平台(任务调度中心)

1、新增执行器

注意:自动注册,xxl-job会自动找到你的机器地址。

也就是你上述在自己项目中配置的执行器ip和端口号,如果你的机器地址为无,那么就手动注册。

2、新增任务处理器

JobHandler来源  

自己项目代码中自定义的名称。

 3、启动任务处理器

启动完成之后,你可以去linux,查看你刚才打印的信息,如果出现则代表成功。

还可以看调度日志

好啦!!以上就是xxl-job的使用啦,哇,深夜2点爆肝的,呜呜呜。希望各位看完之后,能够快速提升自己的实力吧。加油!

附加-运行模式:

BEAN模式

Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。

优点:每个任务只需要一个方法,添加@XxlJob注解即可,方便、快速。

缺点:需要Spring环境

GLUE模式(Java)

GLUE模式(Java)
任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler。开发流程如下:

步骤一:调度中心,新建调度任务:
参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 “GLUE模式(Java)”;

步骤二:开发任务代码:
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑中)。

 其他模式:略

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

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

相关文章

理解TCP/IP协议

一、协议 在计算机网络与信息通讯领域里&#xff0c;人们经常提及 “协议” 一词。互联网中常用的协议有HTTP、TCP、IP等。 协议的必要性 简单来说&#xff0c;协议就是计算机与计算机之间通过网络通信时&#xff0c;事先达成的一种 “约定”。这种“约定”使不同厂商的设备…

精通业务:资深程序员的核心优势

在IT行业&#xff0c;我们常常听到关于技术实力、项目经验、团队协作等方面的讨论&#xff0c;但有一个重要因素常常被忽视&#xff0c;那就是对业务的了解。 对于资深程序员来说&#xff0c;懂业务和不懂业务之间的区别&#xff0c;犹如一道深邃的鸿沟&#xff0c;决定着他们…

【MySQL】:探秘主流关系型数据库管理系统及SQL语言

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL概述1.1 数据库相关概念1.2 主流数据库1.3 数据模型1.3.1 关系型数据库…

QT DAY5作业

1.QT基于TCP服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QMessageBox> //消息对话框类 #include <QTcpSocket> //客户端类 #include <QList> //链表容器类namespace …

unity C#什么时候用“可空类型”

文章目录 例子1. **声明一个可空类型变量&#xff1a;**2. **给可空类型变量赋值&#xff1a;**3. **检查可空类型变量是否有值&#xff1a;**4. **转换与比较&#xff1a;**5. **使用null合并运算符&#xff1a;** 可空类型的重要意义1. **表示缺失或未知的值&#xff1a;**2.…

基于51单片机的智能热水器设计

需要全部文件请私信关注我&#xff01;&#xff01;&#xff01; 基于51单片机的智能热水器设计 摘要一、绪论1.1 选题背景及意义1.2 完成目标与功能设计 二、硬件系统设计2.1 硬件完成要求2.2 方案选择2.3 电源电路设计2.4 键盘电路2.5 蜂鸣器报警电路2.6 温度检测电路2.7 红…

LeetCode刷题--- 删除并获得点数

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

AAAI 2024|ETH轻量化Transformer最新研究,浅层MLP完全替换注意力模块提升性能

论文题目&#xff1a; Rethinking Attention: Exploring Shallow Feed-Forward Neural Networks as an Alternative to Attention Layers in Transformers 论文链接&#xff1a; https://arxiv.org/abs/2311.10642 代码仓库&#xff1a; GitHub - vulus98/Rethinking-attention…

【Redis】非关系型数据库之Redis的增删改查

目录 一、Redis的数据类型分类 二、Redis的字符串类型string 三、Redis的列表list 四、Redis的哈希hash 五、Redis的无序集合set 六、Redis的有序集合zset 七、Redis的通用命令 一、Redis的数据类型分类 通常Redis的数据类型有五大基础类型 String&#xff08;字符串&am…

解决Unexpected record signature 0X9maven 资源过滤

解决Unexpected record signature: 0X9|maven 资源过滤 记录问题&#xff1a;我们有个需求是根据excel模版导出一个excel表。我们的项目是SpringBoot&#xff0c;所以理所当然的把这个模版文件放到了&#xff0c;resources文件夹中。但是在导出文件的时候却遇到了invalid code …

关于tex中的表格设置

文章目录 控制表格列宽和行高控制表格列宽的同时实现居中tex中多表格排列单元格的合并与分割对单个单元格进行操作 控制表格列宽和行高 将下面的代码放在table环境内&#xff0c;放在tabular环境外 调整表格宽度和高度&#xff1a; \resizebox{\textwidth}{2cm}{%第一个{}是表…

Linux之静态库和动态库

目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前&#xff0c;我们讲了静态库和动态库&#xff0c;详情请跳转&#xff1a;静态库和动态库 下面我们将从工程师的角度&#xff0c;去了解静态库和动态库的形成过程&#xff0c;以…

EndNote快速上手

前言&#xff1a;用EndNote主要就是为了方便管理文章引用的文献&#xff0c;所以本篇就是针对EndNote在文章中引用文献需要的技巧&#xff0c;然后本文用的是EndNoteX9。 EndNote快速上手 创建文献资料库创建文献分组导入文献手动输入文件导入在线搜索 修改文献信息去重文献删除…

火出圈的ChatGPT,在地学、地球科学领域的强大应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

一篇文章带你了解Redis的发展史

Redis 是一个开源的内存数据存储和处理系统&#xff0c;它在过去的几十年中经历了重大的发展和演进。以下是 Redis 的发展历程概述&#xff1a; 早期阶段&#xff08;2000年代初至中期&#xff09;&#xff1a;在这个时期&#xff0c;网站的访问量通常较低&#xff0c;单个数据…

在Colab上测试Mamba

我们在前面的文章介绍了研究人员推出了一种挑战Transformer的新架构Mamba 他们的研究表明&#xff0c;Mamba是一种状态空间模型(SSM)&#xff0c;在不同的模式(如语言、音频和时间序列)中表现出卓越的性能。为了说明这一点&#xff0c;研究人员使用Mamba-3B模型进行了语言建模…

MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql

目录 打印MyBatis的日志配置&#xff1a; 灰度发布:指发布环境&#xff0c;比如发布环境有200台机器&#xff0c;发布的时候是一批一批的机器的发布 2.删除与修改 使用Results注解&#xff0c;这样就和上面的别名一个意思&#xff0c;column是数据库的列 自动转驼峰&#…

ubuntu的动图截屏怎么做

在Ubuntu系统中&#xff0c;你可以通过以下步骤来截取动图&#xff08;即屏幕录制并转换为GIF格式&#xff09;&#xff1a; 1,首先&#xff0c;你需要安装一些必要的工具。打开终端并输入以下命令以安装gtk-recordmydesktop&#xff08;用于录制屏幕&#xff09;、mplayer&am…

【快速解决】保姆级Anaconda安装教程

目录 第一步 ​编辑第二步 ​编辑第三步 第四步 第五步 第六步 ​编辑 第七步 第八步 第九步 第一步 在anaconda清华大学开源软件镜像站下载anaconda。点击这里进入 我这里选的是windows-x86_64。 第二步 下载好以后进行安装 第三步 第四步 第五步 选择…

VR全景博物馆——让博物馆“火起来”

不管是十里洋场的繁华、还是红岩革命的英勇&#xff0c;博物馆一直都拥有着丰富的历史沉淀和文化底蕴&#xff0c;通过VR全景拍摄制作技术&#xff0c;我们可以随时随地穿越空间&#xff0c;去切身体验那些历史人物的经历。 传统的实体博物馆受限于地理位置和布局&#xff0c;使…