〇、前言
我们旧的定时任务是使用 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/jobaccessToken: your-tokenappName: your-app-nameip: port: 9090address: logPath: /data/applogs/job/jobhandlerlogRetentionDays: 7
- adminAddresses: 毋庸置疑,这里就是你 XXL-Job 的地址
- accessToken:是一个简单的鉴权token,XXL-Job 在启动前加在配置文件中。同一个XXL-Job管理的所有的服务的Token都是一样的。
- appName: 你的服务名称,需要和 XXL-Job 中配置的一致
- port:这里的 port 可以不是你的服务端口,但是在 XXL-Job 中,不同服务的 port 不能重复。否则会报错。(详见3.1)
- logRetentionDays: 日志存储的时间
3.XxlJobConfig
最后你需要在配置中下新建一个 XxlJobConfig.java
文件,内容如下
prefix="xxl-job") (publicclassXxlJobConfig { privateStringaccessToken; privateStringadminAddresses; privateStringappName; privateStringip; privateintport; privateStringlogPath; privateStringaddress; privateintlogRetentionDays; publicXxlJobSpringExecutorxxlJobExecutor() { log.info("xxl-job config init."); XxlJobSpringExecutorxxlJobSpringExecutor=newXxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appName); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); returnxxlJobSpringExecutor; } }
@ConfigurationProperties
从 yaml 配置中获取参数值@Configuration
这个和其他的配置类一样
二、使用
publicclassTestJob{ "TestHandler") (publicReturnTtest(Stringparam) throwsException { log.info("定时任务触发"); XxlJobLogger.log("定时任务触发"); returnReturnT.SUCCESS; } }
@XxlJob
注解 定义了定时任务的名称,需要和 XXL-Job 后台配置的任务名称一致String param
XXL-Job 后台可以传入的参数,你可以传入一个 Json 串,然后在你的函数中做解析,以此达到你想要的效果。ReturnT
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 即可解决。