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去找到对应的方法执行,(通常用这种方法)。

  g.2 GLUE模式是在线编辑,也就是直接注入写好的方法的service,然后调用对应方法

h.JobHandler:这个就是xxl-job找到我们应用程序定时任务的唯一标识。

i. 路由策略:

 

 

  1. 第一个:选取执行器管理的注册地址列表中的第一个执行器来执行任务;
  2. 最后一个:选取执行器管理的注册地址列表中的最后一个执行器来执行任务;
  3. 轮询:依次选取执行器管理的注册地址列表中的执行器,周而复始。为了应对多个定时任务同时触发带来的数据一致性问题,XXL-JOB 使用一个静态的同步 Map 来存储每个任务的 jobId 和其对应的计数。每次计数增加后,对执行器地址列表的数量取余,将结果作为索引来获取对应的执行器地址。如果超过 24 小时没有触发调用该任务,会清空 Map 以释放一定空间;
  4. 随机:从执行器管理的注册地址列表中随机选取一个执行器来执行任务;
  5. 一致性 HASH:实现一致性 HASH 负载均衡算法;
  6. 最不经常使用:选择最近最少被调度的执行器执行任务(通过次数维度选取任务);
  7. 最近最久未使用:选择距离上次被调度时间最长的执行器执行任务(通过时间维度选取任务),有助于平衡各执行器的工作负载;
  8. 故障转移:在任务路由策略选择“故障转移”的情况下,如果执行器集群中的某一台机器出现故障,将会自动 Failover 切换到一台正常的执行器发送调度请求;
  9. 忙碌转移:当任务分配到某个执行器时,如果该执行器正处于忙碌状态(可能正在执行其他任务或资源紧张),则会尝试将任务转移到其他相对空闲的执行器上执行;
  10. 分片广播:选取执行器管理的注册地址列表中的所有地址,每个地址都执行一次任务。这种方式类似于 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,并且编写好相应业务代码

 

以上内容纯属学习使用~

 

 

posted @ 2025-06-21 17:54  多多指教~  阅读(997)  评论(0)    收藏  举报