分布式定时任务xxl-job搭建使用教程
分布式定时任务xxl-job搭建使用教程
分布式定时任务xxl-job搭建使用教程
一. 笔记初衷
二. 搭建环境
三. 搭建流程
四. 遇见问题
一、笔记初衷
以前用的定时任务都是spring自带的定时器,虽然可以满足基本的开发需求,但是近几年的需求越来越灵活,越来越自动化,导致spring自带的定时器无法满足。所以我就在网上找寻资料,自己钻研,发现了一个很好用的分布式定时任务,可以实现动态的去实现定时任务,简单易上手。于是这章笔记就横空出世了😛
二、搭建环境
- win10电脑
- xxl-job官网使用教程:https://www.xuxueli.com/xxl-job/
- xxl-job源码下载地址:
- Maven3+
- Jdk1.8+
- Mysql5.7+
三、搭建流程
一、下载xxl-job源码(下载地址附上)
- 我下载的版本是2.2.0的版本,可以根据你自己在项目中的pom依赖来选择性的进行下载源码
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
-
源码下载之后找到doc-->db这个文件夹,把里面的sql文件拿出来执行一遍(记住要先创建数据库哦!!!)
-
然后再更改数据库连接信息
-
启动xxl-job项目,启动的是xxl-job-admin的model
二、创建springboot项目
创建springboot项目就不过多演示,如不清楚怎么创建自行百度😄
三、springboot配置文件及核心代码
-
application.yml配置文件
server: port: 30125 ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver ### 调度中心通讯TOKEN [选填]:非空时启用; xxl: job: ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" admin: addresses: http://127.0.0.1:8080/xxl-job-admin ### xxl-job, access token accessToken: executor: ### xxl-job executor appname appname: xxl-job-demo ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null address: ### xxl-job executor server-info ip: port: 9909 ### xxl-job executor log-path logpath: /data/applogs/xxl-job-demo/jobhandler ### xxl-job executor log-retention-days logretentiondays: 7
-
xxl-job配置类核心代码
package com.star; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author pengxin * @Date 2022/6/6 10:26 * @Remarks */ @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.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
-
编写项目定时任务执行器
package com.star.handler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * @Author pengxin * @Date 2022/6/6 11:00 * @Remarks */ @Component public class DemoXXLJobHandler { private Logger logger = LoggerFactory.getLogger(DemoXXLJobHandler.class); @XxlJob(value = "job") public ReturnT<String> execute(String param) throws Exception { logger.info("xxl-job hello world"); System.out.println("定时任务已启动"); return ReturnT.SUCCESS; } }
-
启动springboot项目
-
访问地址http://127.0.0.1:8080/xxl-job-admin(这个地址就是你配置文件里的xxl.job.admin.addresses>)
- 初始账号密码:admin 123456
- 可以访问并登录就说明搭建完成了(如没有搭建完成请看下面我遇到的问题及解决方案)
四、xxl-job使用
-
首先在执行器管理中创建一个执行器
-
AppName:对应你配置文件里面的xxl.job.admin.executor.appname,多个项目时名字不能重复
-
名称:自己随便取一个好听霸气的名字
-
注册方式:最好选择手动录入,手动录入就必须要填写机器地址
-
机器地址:http://ip+端口号/(端口号来源于xxl.job.admin.executor.port)
-
-
然后在任务管理创建一个管理器需要注意的点:
1. 运行模式:选择默认的即可
2. JobHandler:这个跟你代码中的@XxlJob(value = "job")名字相同
3. 任务参数:如果某些定时任务需要特定的参数,在任务参数中填写即可
4. 其他的全部默认不需要动,必填的填写上就行了
5. 创建完成之后点操作启动就行了
-
查看效果
四、遇见问题
遇到问题不可怕,可怕的是遇到问题没能解决这个问题,呜呜呜、太难受了🙁
问题一:项目启动报空指针NullPointerException
解决NullPointerException的方案
这个报空指针的问题是因为你少导入了一个依赖包,把springboot-web的依赖包导入就可以了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
问题二、拒绝连接问题
解决拒绝连接方案
这个拒绝连接的问题是你源码没有启动起来,或者是你的源码项目启动错了,把源码下载下来,启动xxl-job-admin
问题三、任务调度失败msg:xxl-job remoting error(no protocol: 127.0.0.1:9909/run)
解决方案
这个错误是因为你的执行器管理里面的机器地址写错了,里面必须要严格按照这个格式写http://ip+端口/
问题四、任务调度失败404msg:xxl-job remoting fail, StatusCode(404) invalid
解决方案
这个错误是因为你的执行器管理里面的ip地址或者端口地址写错了,端口地址来源是你的配置文件xxl.job.admin.executor.port,不是项目启动端口号server.port