〇、前言
我们旧的定时任务是使用 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');
评论区