相关推荐recommended
XXL-JOB详解(整合springboot)保姆级教程
作者:mmseoamin日期:2024-01-19

文章目录

  • XXL-JOB简介
    • XXL-JOB是什么
    • 为什么需要任务调度平台,而不用传统的 Timer 与 Quartz
    • 为什么选择XXL-JOB,不选择elasticjob
    • ==学习之前必看,少走很多弯路==
    • 安装XXL-JOB
      • 一、源码编译(Windows)
        • 1、拉取源码:[xxl-job: 一个分布式任务调度平台](https://gitee.com/xuxueli0323/xxl-job?_from=gitee_search)
        • 2、导入IDEA,查看一下目录
        • 3、初始化数据库,配置数据库连接信息(在本地导入上图中的sql文件,并把配置文件给改好)
        • 4.1、编译运行
        • 4.2、jar包运行(这样就可以直接部署到Linux服务器上了)
          • (1)打包
          • (2)在xxl-job-admin打开jar包目录
          • (3)打开cmd,使用`java -jar xxl-job-admin-2.4.0-SNAPSHOT.jar`命令
          • (4)访问`http://localhost:8080/xxl-job-admin/toLogin`
          • 二、Docker安装(Linux)
            • 1、初始化数据库(把数据库安装到Linux服务器)(当然你有更好的方式最好,比如我觉得宝塔就非常的快,但这里我就带大家再熟悉一下mysql的知识点)
              • (1)、上传sql文件到linux服务器中(使用工具:宝塔面板、filezilla、Xftp都可以)
              • (2)、在mysql中创建`xxl-job`的表
              • (3)、mysql创建新用户并授权,开放权限允许其他ip访问(因为docker容器与宿主机是分开的,所有相当于是用外网连接的mysql)
                • 方法一:把root用户放开给所有人使用,不推荐,不安全
                • 方法二:创建新用户并授权
                • 2、docker启动xxl-job
                  • (1)、拉取镜像(可以跳过,因为直接run的话也可以拉取镜像)
                  • (2)、执行命令
                  • (3)、查看docker运行状态
                  • (4)、开放4090端口,记得开放mysql的3306端口哦
                    • 方法一:
                    • 方法二:
                    • 方法三:==推荐==
                    • 方法四:
                    • (5)、访问 `http://ip地址:4090/xxl-job-admin`
                    • PS:如果要修改 XXL-JOB 账号密码的话,可以先在右上角点击修改密码(因为密码是加密的,直接改数据库话,要按照他的规格来整理,很麻烦),账号的话就在数据库里面修改就好了
                    • 使用XXL-JOB(集成SpringBoot)(==必须两个服务都在本地,或者都在服务器端==)
                      • SpringBoot配置:
                        • 一、导入maven依赖
                        • 二、配置yaml
                        • 三、XxlJobConfig配置类
                        • 四、Demo.java
                        • XXL-JOB配置(与上文的yaml文件结合着看)
                          • 一、看一下自己的 IPV4 地址:cmd中使用`ipconfig`
                          • 二、配置执行器
                          • 三、配置任务管理(配合Demo.java看)Cron表达式我放最后了
                          • 四、测试
                          • 五、查看运行结果
                          • Cron生成器(一般不自己写,所以只需要稍微了解下就行):[在线Cron表达式生成器)](http://cron.ciding.cc/)
                            • Cron学习:
                            • 如果本文带给了你帮助,请点个赞吧
                            • 参考文章:

                              XXL-JOB简介

                              有兴趣的小伙伴可以去看一下他的官网:分布式任务调度平台XXL-JOB (xuxueli.com)

                              XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第1张

                              XXL-JOB是什么

                              XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

                              为什么要叫 XXL 呢?答:是因为他的作者的名字叫许雪里,使用了名字的缩写

                              分布式任务调度平台是什么呢?答:一个定时任务实现方案

                              在平时的业务场景中,经常有一些场景需要使用定时任务,比如:

                              时间驱动的场景:某个时间点发送优惠券,发送短信等等。批量处理数据:批量统计上个月的账单,统计上个月销售数据等等。固定频率的场景:每隔5分钟需要执行一次。所以定时任务在平时开发中并不少见,而且对于现在快速消费的时代,每天都需要发送各种推送,消息都需要依赖定时任务去完成,

                              为什么需要任务调度平台,而不用传统的 Timer 与 Quartz

                              在Java中,传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题:

                              • 不支持集群、不支持统计、没有管理平台、没有失败报警、没有监控等等而且在现在分布式的架构中,有一些场景需要分布式任务调度:

                              • 同一个服务多个实例的任务存在互斥时,需要统一的调度。

                              • 任务调度需要支持高可用、监控、故障告警。

                              • 需要统一管理和追踪各个服务节点任务调度的结果,需要记录保存任务属性信息等。

                                显然传统的定时任务已经不满足现在的分布式架构,所以需要一个分布式任务调度平台,目前比较主流的是elasticjob和xxl-job。

                                为什么选择XXL-JOB,不选择elasticjob

                                跟xxl-job不同的是,elasticjob是采用zookeeper实现分布式协调,实现任务高可用以及分片。

                                • xxl-job环境依赖于mysql,elasticjob依赖于ZooKeeper,这也是最大的不同。

                                • elasticjob是无中心化的,通过ZooKeeper的选举机制选举出主服务器,如果主服务器挂了,会重新选举新的主服务器。因此elasticjob具有良好的扩展性和可用性,但是使用和运维有一定的复杂;xxl-job则相反,是通过一个中心式的调度平台,调度多个执行器执行任务,调度中心通过DB锁保证集群分布式调度的一致性,这样扩展执行器会增大DB的压力,但是如果实际上这里数据库只是负责任务的调度执行。但是如果没有大量的执行器的话和任务的情况,是不会造成数据库压力的。实际上大部分公司任务数,执行器并不多(虽然面试经常会问一些高并发的问题)。

                                  相对来说,xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与SpringBoot有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,对于企业维护起来成本不高,还有失败的邮件告警等等。这就使很多企业选择xxl-job做调度平台。

                                  学习之前必看,少走很多弯路

                                  我先讲一下xxl-job的运行原理(我自己的理解):xxl-job是一个网页,用来处理注册在里面的请求,并每过多长的时间(自己设置)就会传递一个值给springboot,这样就会出现一个问题:xxl-job要在局域网下才能连接成功。

                                  向下面的docker安装方法,就是典型的例子,本地的服务(springboot)是连接不上服务器端的

                                  为什么?:很简单个理由就是,在同一个网段下(本地),xxl-job可以给本地服务(springboot)发送服务;但如果xxl-job是在服务器上,那么你能跟他通信,但他不能给你通信,意思就是他ping你的ip是ping不通的

                                  解决方法1:先在本地做测试的环境,服务器上的也做一样的配置,本地把服务(springboot)打包后,上传服务器,那么两个服务器直接就可以建立联系,或者上传到同一服务器上,组成服务器的本地环境

                                  解决方法2:进入服务器上的xxl-job访问不了本地的,是因为本地不能被外网访问,那么就用内网穿透工具,让外网服务器可以访问本地端口就行

                                  安装XXL-JOB

                                  在这里我讲两种安装方式:

                                  • 源码编译(Windows)
                                  • Docker安装(Linux)

                                    一、源码编译(Windows)

                                    1、拉取源码:xxl-job: 一个分布式任务调度平台

                                    2、导入IDEA,查看一下目录

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第2张

                                    3、初始化数据库,配置数据库连接信息(在本地导入上图中的sql文件,并把配置文件给改好)

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第3张

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第4张

                                    4.1、编译运行

                                    访问http://localhost:8080/xxl-job-admin/toLogin

                                    进入管理页面。默认账号/密码:admin/123456。

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第5张

                                    4.2、jar包运行(这样就可以直接部署到Linux服务器上了)

                                    不知道怎么做的朋友可以看(两者选其一看就行,第二种方法比较小白,我相信学到xxl-job的朋友这些都可以了解过,如果忘记了,看第一篇就好了):

                                    使用Linux命令行发布springboot、javaWeb项目_我认不到你的博客-CSDN博客_linux springboot jar 发布

                                    宝塔搭建SSM(Web项目也一样)和Springboot项目,超详细图解_我认不到你的博客-CSDN博客_宝塔怎么部署ssm redis项目

                                    在配置好mysql的情况下,打成jar包,使用java -jar jar包名字运行。

                                    (1)打包

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第6张

                                    (2)在xxl-job-admin打开jar包目录

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第7张

                                    (3)打开cmd,使用java -jar xxl-job-admin-2.4.0-SNAPSHOT.jar命令

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第8张

                                    (4)访问http://localhost:8080/xxl-job-admin/toLogin

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第9张

                                    二、Docker安装(Linux)

                                    不知道怎么安装docker的小伙伴可以看看这篇:Linux(CentOS 7)安装Docker和Docker Compose,并配置docker镜像_我认不到你的博客-CSDN博客

                                    1、初始化数据库(把数据库安装到Linux服务器)(当然你有更好的方式最好,比如我觉得宝塔就非常的快,但这里我就带大家再熟悉一下mysql的知识点)

                                    (1)、上传sql文件到linux服务器中(使用工具:宝塔面板、filezilla、Xftp都可以)
                                    (2)、在mysql中创建xxl-job的表
                                    # 一、登录
                                    # 登录mysql方式1  -p 后面不要有空格!!!!!!!!!!!!!!!!!!!!
                                    mysql -u用户名 -p密码
                                    # 登录mysql方式2 
                                    mysql -u用户名 -p # 回车后填写密码
                                    # 二、创建字符集为 utf8mb4 的数据表 别忘了 ; !!!!!!!!!!!!!!!!!!!!!
                                    CREATE DATABASE `xxl_job` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
                                    # 三、查看表
                                    SHOW DATABASES;
                                    # 成功案例
                                    # mysql> CREATE DATABASE `xxl-job` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
                                    # Query OK, 1 row affected (0.04 sec)
                                    # 
                                    # mysql> SHOW DATABASES;
                                    # +--------------------+
                                    # | Database           |
                                    # +--------------------+
                                    # | information_schema |
                                    # | mysql              |
                                    # | performance_schema |
                                    # | sql120_48_77_24    |
                                    # | sys                |
                                    # | xxl-job            |
                                    # +--------------------+
                                    # 6 rows in set (0.00 sec)
                                    # 四、把sql导入
                                    # 1、进入指定数据库
                                    use xxl-job;
                                    # 2、选中导入路径 source /路径/tables_xxl_job.sql; 
                                    source /www/wwwroot/tables_xxl_job.sql;
                                    # 3、查看是否导入成功
                                    show tables;
                                    #成功案例
                                    # mysql> show tables;
                                    # +--------------------+
                                    # | Tables_in_xxl_job  |
                                    # +--------------------+
                                    # | xxl_job_group      |
                                    # | xxl_job_info       |
                                    # | xxl_job_lock       |
                                    # | xxl_job_log        |
                                    # | xxl_job_log_report |
                                    # | xxl_job_logglue    |
                                    # | xxl_job_registry   |
                                    # | xxl_job_user       |
                                    # +--------------------+
                                    # 8 rows in set (0.00 sec)
                                    # 五、退出 mysql 编辑:键盘的 Ctrl+D
                                    Ctrl+D
                                    
                                    (3)、mysql创建新用户并授权,开放权限允许其他ip访问(因为docker容器与宿主机是分开的,所有相当于是用外网连接的mysql)
                                    方法一:把root用户放开给所有人使用,不推荐,不安全
                                    mysql> show databases;
                                    mysql> use mysql;
                                    mysql> update user set host = '%'  where user = 'root';
                                    mysql> select hosh,user from user;
                                    mysql> exit
                                    
                                    方法二:创建新用户并授权

                                    ① 创建用户:CREATE USER 'xxl'@'%' IDENTIFIED BY '123456';

                                    # 创建用户
                                    mysql> CREATE USER 'username'@'host' IDENTIFIED BY 'password';
                                    # 例子 dog 用户供所有人访问
                                    mysql> CREATE USER 'xxl'@'%' IDENTIFIED BY '123456';
                                    

                                    说明: username:你将创建的用户名

                                    host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%

                                    password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器

                                    ② 授权:GRANT ALL ON xxl_job.* TO 'xxl'@'%';

                                    # 授权
                                    mysql> GRANT privileges ON databasename.tablename TO 'username'@'host' 
                                    # 例子
                                    mysql> GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
                                    mysql> GRANT ALL ON *.* TO 'pig'@'%';
                                    

                                    说明: privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL

                                    databasename:数据库名 tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*

                                    ③ 完成用户的创建后,请记得刷新系统权限表;

                                    mysql> flush privileges;
                                    

                                    2、docker启动xxl-job

                                    (1)、拉取镜像(可以跳过,因为直接run的话也可以拉取镜像)
                                    docker pull xuxueli/xxl-job-admin:2.3.0
                                    
                                    (2)、执行命令
                                    docker run -d --name xxl-job-admin -p 4090:8080 \
                                    -e PARAMS="\
                                    --spring.datasource.url=jdbc:mysql://ip地址:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai \
                                    --spring.datasource.username=xxl \
                                    --spring.datasource.password=123456" \
                                    -v /usr/local/xxl-job/admin/logs:/data/applogs \
                                    --privileged=true \
                                    --name xxl-job \
                                    xuxueli/xxl-job-admin:2.3.0
                                    
                                    (3)、查看docker运行状态
                                    [root@instance-yusr6p10 ~]# docker ps
                                    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS            NAMES
                                    ae7a23e761d9   xuxueli/xxl-job-admin:2.3.0   "sh -c 'java -jar $J…"   About a minute ago   Up About a minute   0.0.0.0:4090->8080/tcp, :::4090->8080/tcp   xxl-job-admin
                                    
                                    (4)、开放4090端口,记得开放mysql的3306端口哦
                                    方法一:
                                    #  关闭防火墙;不推荐
                                    systemctl top firewalld
                                    
                                    方法二:

                                    命令含义:

                                    –zone #作用域

                                    –add-port=1935/tcp #添加端口,格式为:端口/通讯协议

                                    –permanent #永久生效,没有此参数重启后失效

                                    # 1、开启防火墙
                                    systemctl start firewalld
                                    # 2、开放指定端口(比如4090端口)
                                    firewall-cmd --zone=public --add-port=4090/tcp --permanent
                                    # 3、重启防火墙
                                    firewall-cmd --reload
                                    # 4、查看端口号
                                    netstat -ntlp   #查看当前所有tcp端口·
                                    netstat -ntulp |grep 1935   #查看所有1935端口使用情况·
                                    
                                    方法三:推荐
                                    # 开放4090端口 
                                    /sbin/iptables -I INPUT -p tcp --dport 4090 -j ACCEPT
                                    # 禁用端口
                                    /sbin/iptables -I INPUT -p tcp --dport [port] -j DROP
                                    # 指定ip开放端口
                                    /sbin/iptables -I INPUT -h [ip] -p tcp --dport [port] -j ACCEPT
                                    # 指定ip禁用端口
                                    /sbin/iptables -I INPUT -h [ip] -p tcp --dport [port] -j DROP
                                    # 查看现有设置
                                    /sbin/iptables -L
                                    # 清除现有设置
                                    /sbin/iptables -F
                                    
                                    方法四:
                                    -A INPUT -m state --state NEW -m tcp -p tcp --dport 4090 -j ACCEPT
                                     
                                    service iptables restart
                                    
                                    (5)、访问 http://ip地址:4090/xxl-job-admin

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第10张

                                    PS:如果要修改 XXL-JOB 账号密码的话,可以先在右上角点击修改密码(因为密码是加密的,直接改数据库话,要按照他的规格来整理,很麻烦),账号的话就在数据库里面修改就好了

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第11张

                                    使用XXL-JOB(集成SpringBoot)(必须两个服务都在本地,或者都在服务器端

                                    SpringBoot配置:

                                    一、导入maven依赖

                                            
                                            
                                                com.xuxueli
                                                xxl-job-core
                                                2.3.1
                                            
                                    

                                    二、配置yaml

                                    xxl:
                                      job:
                                        admin:
                                          addresses: http://localhost:8080/xxl-job-admin
                                        accessToken:
                                        executor:
                                          appname: zpa-job
                                          #ip: 10.123.1.53
                                          port: 9999
                                          # 日志地址
                                          logpath: /data/applogs/xxl-job/jobhandler
                                          # 日志保存时间
                                          logretentiondays: 30
                                    

                                    三、XxlJobConfig配置类

                                    @Configuration
                                    @Slf4j
                                    public class XxlJobConfig {
                                     
                                        @Value("${xxl.job.admin.addresses}")
                                        private String adminAddresses;
                                     
                                        @Value("${xxl.job.executor.appname}")
                                        private String appName;
                                     
                                        /*@Value("${xxl.job.executor.ip}")
                                        private String ip;*/
                                     
                                        @Value("${xxl.job.executor.port}")
                                        private int port;
                                     
                                        @Value("${xxl.job.accessToken}")
                                        private String accessToken;
                                     
                                        @Value("${xxl.job.executor.logpath}")
                                        private String logPath;
                                     
                                        @Value("${xxl.job.executor.logretentiondays}")
                                        private int logRetentionDays;
                                     
                                     
                                        @Bean(initMethod = "start", destroyMethod = "destroy")
                                        public XxlJobSpringExecutor xxlJobExecutor() {
                                            log.info(">>>>>>>>>>> xxl-job config init.");
                                            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
                                            xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
                                            xxlJobSpringExecutor.setAppName(appName);
                                            //xxlJobSpringExecutor.setIp(ip);
                                            xxlJobSpringExecutor.setPort(port);
                                            xxlJobSpringExecutor.setAccessToken(accessToken);
                                            xxlJobSpringExecutor.setLogPath(logPath);
                                            xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
                                     
                                            return xxlJobSpringExecutor;
                                        }
                                     
                                    }
                                    

                                    四、Demo.java

                                    @Component
                                    public class XxlDemoHandler {
                                        @XxlJob("Demo")
                                        public ReturnT demo(){
                                            String param = XxlJobHelper.getJobParam();
                                            XxlJobHelper.log("测试开始");
                                            System.out.println();
                                            System.out.println();
                                            System.out.println();
                                            System.out.println(param);
                                            System.out.println("测试完成!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                                            System.out.println();
                                            System.out.println();
                                            System.out.println();
                                            XxlJobHelper.log("测试开结束");
                                            return ReturnT.SUCCESS;
                                        }
                                    }
                                    

                                    XXL-JOB配置(与上文的yaml文件结合着看)

                                    一、看一下自己的 IPV4 地址:cmd中使用ipconfig

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第12张

                                    二、配置执行器

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第13张

                                    三、配置任务管理(配合Demo.java看)Cron表达式我放最后了

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第14张

                                    四、测试

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第15张

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第16张

                                    五、查看运行结果

                                    springboot:

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第17张

                                    xxl-job:

                                    XXL-JOB详解(整合springboot)保姆级教程,第18张

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第19张

                                    XXL-JOB详解(整合springboot)保姆级教程,在这里插入图片描述,第20张

                                    Cron生成器(一般不自己写,所以只需要稍微了解下就行):在线Cron表达式生成器)

                                    Cron学习:

                                    Cron表达式简单学习

                                    如果本文带给了你帮助,请点个赞吧

                                    参考文章:

                                    3千字带你搞懂XXL-JOB任务调度平台 (baidu.com)

                                    Failed to restart iptables.service: Unit not found.

                                    分布式调度平台启动报错:com.xxl.rpc.util.XxlRpcException: xxl-rpc request data empty. - 灰信网(软件开发博客聚合) (freesion.com)