简述
在我们日常开发中会有一些业务逻辑需要定时任务处理,常用的定时任务有quartz和多线程定时任务@Scheduled实现,但是实现并没有良好的上报数据和监控数据,定时任务的结果无法实时告诉我们以及一些错误转移和并发定时调度问题等。要实现并发定时调度和故障转移等功能时存在难点,因此使用xxl-job处理此问题。这篇文章简单记录使用xxl-job使用。
技术栈
- spring boot基础框架模块
- java基础技术
- xxl-job分布式调度
分支模块
这里居于上一章节项目创建 feat/xxl-job分支
xxl-job样例
调度中心
- 官网源码地址:git仓库地址
- mysql表:https://github.com/xuxueli/xxl-job/blob/2.2.0/doc/db/tables_xxl_job.sql
- 可直接下载代码打包,或者使用docker打包下载使用。这里我个人使用docker镜像运行,docker-compose.yml(docker-compose up -d启动)如下:
version: '2.0'
services:
xxl-job-admin:
image: xuxueli/xxl-job-admin:2.2.0 # 公司使用版本
container_name: xxl-job-admin
restart: always
environment:
# host.docker.internal: 主机地址
PARAMS: "--spring.datasource.username=root --spring.datasource.password=root --spring.datasource.url=jdbc:mysql://host.docker.internal:3306/xxl_job?Unicode=true&characterEncoding=UTF-8"
volumes:
- /docker-software/xxl-job/applogs:/data/applogs
ports:
- "8089:8080"
启动成功后,登录调度中心查看http://localhost:8089/xxl-job-admin/ ,默认登录用户名和密码是admin/123456
如图:
执行器
导入core代码
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
配置注册xxl
application-dev.yaml配置
server:
port: 8088
xxl:
job:
admin:
address: http://localhost:8089/xxl-job-admin
executor:
appname: user-center
ip: 127.0.0.1
port: 9999
logpath: ./logs/xxl-job
logretentiondays: 30
XxlJobSpringExecutor配置
package com.lgh.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "xxl.job.executor")
public class XxlJobExecutorConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobExecutorConfig.class);
@Value("${xxl.job.admin.address}")
private String adminAddresses;
private String appname;
private String ip;
private int port;
private String accessToken = "";
private String logPath;
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
执行中心使用
调度逻辑代码
package com.lgh.job;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class XxlJobTest extends IJobHandler {
@XxlJob("testJob")
@Override
public ReturnT<String> execute(String s) throws Exception {
try {
log.info(String.format("XxlJobTest execute,params is %s", s));
} catch (Exception e) {
return FAIL;
}
return SUCCESS;
}
}
调度配置
执行器配置,记住,这里是docker容器,真实的ip地址是宿主ip,即host.docker.internal
任务配置
验证
查看日志验证或者打断点:
2021-02-27 17:08:50.014 INFO 40101 --- [dPool-799972927] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:2, handler:com.xxl.job.core.handler.impl.MethodJobHandler@3656a6cd[class com.lgh.job.XxlJobTest#execute]
2021-02-27 17:08:50.015 INFO 40101 --- [ Thread-12] com.lgh.job.XxlJobTest : XxlJobTest execute,params is 测试XxlJobTest
2021-02-27 17:08:52.418 INFO 40101 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2021-02-27 17:08:55.008 INFO 40101 --- [ Thread-12] com.lgh.job.XxlJobTest : XxlJobTest execute,params is 测试XxlJobTest
2021-02-27 17:09:00.000 INFO 40101 --- [ Thread-12] com.lgh.job.XxlJobTest : XxlJobTest execute,params is 测试XxlJobTest
2021-02-27 17:09:04.994 INFO 40101 --- [ Thread-12] com.lgh.job.XxlJobTest : XxlJobTest execute,params is 测试XxlJobTest