侧边栏壁纸
  • 累计撰写 58 篇文章
  • 累计创建 67 个标签
  • 累计收到 1 条评论

SpringBoot 接入 XXL-Job

lihaocheng
2022-06-10 / 0 评论 / 0 点赞 / 1,641 阅读 / 781 字
温馨提示:
晚上记得开启夜间模式哦

〇、前言

我们旧的定时任务是使用 Spring 自带的 TaskExecutor 来实现的。这种实现方式在多实例的情况下,需要进行加锁处理。否则多个实例会都执行到了同一个定时任务。

换成 XXL-Job 主要就想更简单的解决这个问题。

一、配置

1.Maven

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

2.配置文件

这里我使用的是 yaml 的配置

xxl-job:
  adminAddresses: http://localhost:8100/job
  accessToken: your-token 
  appName: your-app-name
  ip: 
  port: 9090
  address:
  logPath: /data/applogs/job/jobhandler
  logRetentionDays: 7
  • adminAddresses: 毋庸置疑,这里就是你 XXL-Job 的地址
  • accessToken:是一个简单的鉴权token,XXL-Job 在启动前加在配置文件中。同一个XXL-Job管理的所有的服务的Token都是一样的。
  • appName: 你的服务名称,需要和 XXL-Job 中配置的一致
  • port:这里的 port 可以不是你的服务端口,但是在 XXL-Job 中,不同服务的 port 不能重复。否则会报错。(详见3.1)
  • logRetentionDays: 日志存储的时间

3.XxlJobConfig

最后你需要在 config 文件夹下新建一个 XxlJobConfig.java文件,内容如下

@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "xxl-job")
public class XxlJobConfig {

    private String accessToken;

    private String adminAddresses;

    private String appName;

    private String ip;

    private int port;

    private String logPath;

    private String address;

    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.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;
    }
}
  • @ConfigurationProperties 从 yaml 配置中获取参数值
  • @Configuration 这个和其他的配置类一样

二、使用

@Slf4j
@Component
public class TestJob{
    @XxlJob("TestHandler")
    public ReturnT<String> test(String param) throws Exception {
        log.info("定时任务触发");
        XxlJobLogger.log("定时任务触发");
        return ReturnT.SUCCESS;
    }
}
  • @XxlJob 注解 定义了定时任务的名称,需要和 XXL-Job 后台配置的任务名称一致
  • String param XXL-Job 后台可以传入的参数,你可以传入一个 Json 串,然后在你的函数中做解析,以此达到你想要的效果。
  • ReturnT<String> XXL-Job 函数返回格式
  • XxlJobLogger.log("") XXL-Job 自带的日志,日志会保存在 XXL-Job 中

三、常见问题

1.java.net.BindException: 地址已在使用

Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
...
...
...
Caused by: java.net.BindException: 地址已在使用

这是因为 XXL-Job 中有其他服务使用了和你 port 配置一样的端口导致。修改配置的 port 即可解决。

2.多节点 XXL-Job ,定时任务同一时间执行了多次

在XXL-JOB中,xxl_job_lock表用于实现任务执行的互斥锁,以防止并发执行问题。查询对应表初始化的时候是否配置了锁。

SELECT * FROM `xxl_job_lock` where lock_name = 'schedule_lock' ;

如果没有则加一个

INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
0

评论区