springboot整合xxl-job
本文记录一下,项目中如何集成xxl-job
一、下载源码并运行项目(这里是用window打开,如果想部署到服务器上也行,因为此处只是学习使用,就使用window)
1、下载项目(使用源码运行):https://gitee.com/xuxueli0323/xxl-job
这是个springboot工程,使用git将项目拉取到本地(项目目录最好是英文)

2、 使用idea打开,修改一些配置

比如端口,尽量别用默认的8080,因为容易和别的项目冲突,可以改下,其次就是数据库的IP,账号密码等
3、在doc目录下有个SQL文件,将其放到你的MySQL数据库那边执行一下

执行后如下

4、在生产环境中,这个accessToken和email地址可能需要配置一下

4、访问可视化页面: http://localhost:8086/xxl-job-admin/toLogin 。默认账号:admin 默认密码:123456

5、登录成功以后如下页面

运行报表能看到目前xxl-job定时任务的运行情况,调度日志可以看到定时任务的调度情况,失败或者成功的记录
执行器管理 === 项目的维度
任务管理 === 项目中的定时任务
6、任务管理页面新增

a.执行器:就是该定时任务归属那个项目下;
b.任务描述:对该定时任务做了什么事情大概描述;
c.负责人:填写相应定时任务负责人;
d.报警邮件:非必填,也就是如果定时任务出现问题,发送邮件给对应邮箱中;
e.调度类型:corn、固定速度;
f.Corn:定时任务触发时机;
g.运行模式:BEAN、GLUE(JAVA)
g.1 bean模式是使用注解的方式,在定时任务中通过JobHandler去找到对应的方法执行,(通常用这种方法)。
h.JobHandler:这个就是xxl-job找到我们应用程序定时任务的唯一标识。
i. 路由策略:

- 第一个:选取执行器管理的注册地址列表中的第一个执行器来执行任务;
- 最后一个:选取执行器管理的注册地址列表中的最后一个执行器来执行任务;
- 轮询:依次选取执行器管理的注册地址列表中的执行器,周而复始。为了应对多个定时任务同时触发带来的数据一致性问题,XXL-JOB 使用一个静态的同步 Map 来存储每个任务的 jobId 和其对应的计数。每次计数增加后,对执行器地址列表的数量取余,将结果作为索引来获取对应的执行器地址。如果超过 24 小时没有触发调用该任务,会清空 Map 以释放一定空间;
- 随机:从执行器管理的注册地址列表中随机选取一个执行器来执行任务;
- 一致性 HASH:实现一致性 HASH 负载均衡算法;
- 最不经常使用:选择最近最少被调度的执行器执行任务(通过次数维度选取任务);
- 最近最久未使用:选择距离上次被调度时间最长的执行器执行任务(通过时间维度选取任务),有助于平衡各执行器的工作负载;
- 故障转移:在任务路由策略选择“故障转移”的情况下,如果执行器集群中的某一台机器出现故障,将会自动 Failover 切换到一台正常的执行器发送调度请求;
- 忙碌转移:当任务分配到某个执行器时,如果该执行器正处于忙碌状态(可能正在执行其他任务或资源紧张),则会尝试将任务转移到其他相对空闲的执行器上执行;
- 分片广播:选取执行器管理的注册地址列表中的所有地址,每个地址都执行一次任务。这种方式类似于 MQ 的广播模式,可以将任务广播到集群中的所有执行器上执行。此策略适用于需要在多个执行器上同时执行相同任务的场景,例如数据同步或分布式计算等。
j. 调度过期策略:当需要执行定时任务的时间时候,服务挂了,等服务重启之后该如何处理没执行的定时任务(忽略、立即执行)
关于xxl-job的介绍就到此为止。
二、项目中如何引进xxl-job并且编写相应代码呢
1、引入相关依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1</version>
</dependency>
2、配置文件中添加相关配置:
xxl: job: executor: appname: ${spring.application.name} logpath: ${spring.application.name}/xxl-job logretentiondays: 30 admin: addresses: http://127.0.0.1:8080/xxl-job-admin accessToken: default_token
注意替换相关配置,比如IP、token等
3、添加执行器到Ioc容器
我们的xxl-job相关配置,最好添加到IOC容器中管理
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class xxlJobConfig { @Value("${xxl-job.executor.app-name}") private String appName; @Value("${xxl-job.executor.log-path}") private String logPath; @Value("${xxl-job.executor.log-retention-days}") private int logRetentionDays; @Value("${xxl-job.admin.address}") private String adminAddresses; @Value("${xxl-job.access-token}") private String accessToken; @Value("${server.port}") private int port; @Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setAppname(appName); xxlJobSpringExecutor.setPort(port + 1000); //IP加上1000是因为不和系统那边一致,可自行定义 xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
4、具体的业务使用
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.spring.aicloud.entity.User; import com.spring.aicloud.service.IUserService; import com.xxl.job.core.handler.annotation.XxlJob; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component //将其注入到IOC容器中 public class TimesTask { @Resource private IUserService userService; @Value("${system.user.count}") private int userCount; @XxlJob("updateUserCount") //使用注解 public void updateUserCount() { LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(User::getUseCount, userCount); updateWrapper.eq(User::getUsername, "wangwu"); boolean update = userService.update(updateWrapper); if (!update){ //todo 使用邮箱发送给相应的负责人进行提醒 System.out.println("更新用户使用次数失败"); } } }
这业务使用有2个需要注意的地方,一个是使用@Component ,将其注入到IOC容器中;其次是使用关键注解:@XxlJob("updateUserCount") ,这个updateUserCount 需要和你在xxl-job那边配置的jobHandler配置要一致,xxl-job才能找到对应的定时任务代码执行。
关于这种定时任务的执行,和调用远程接口一样,最好都打好日志,方便服务器上定位问题。
5、当项目启动完成,我们可以在执行器管理看到注册上去的项目节点

6 、打开任务管理页面,点击执行一次,如果项目中执行了一次,就可以知道已经完成

总结一下:
1、启动xxl-job服务、配置好相应定时规则;
2、项目中引入xxl-job,并且编写好相应业务代码
以上内容纯属学习使用~
浙公网安备 33010602011771号