1.因为在服务中写定时任务,当服务发布多份实例时,会多次执行,可能造业务数据混乱,把定时任务执行次数分离出来,由分布式任务调度平台去控制
2.本篇将介绍 xxl-job
3.概要说明,xxl-job的工作原理
- 1.部署xxl-job服务端,由该服务端控制业务服务里面的定时任务执行次数和时间
- 2.在业务服务中引入xxl-job客户端依赖,指定xxl-job服务端的地址,相当于向服务端注册本服务的IP+PORT,这样xxl-job服务端才能调用业务服务里面的定时任务
- 3.在xxl-job服务端提供的Web管理后台控制任务执行时间
以上是我对xxl-job的理解,具体请参考官网文档
4.部署xxl-job服务端,将采用docker部署
xxl-job需要mysql数据库存储任务配置信息,因此需要先把数据库和表数据初始化好,官网提供了脚步
https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql
#配置好mysql地址和账户信息,把日志信息映射到宿主机
docker run -it -d -e PARAMS="--spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456" \
-v /root/xxl-job/data/applogs:/data/applogs \
--name xxl-job-admin \
-p 8080:8080 \
--network=host xuxueli/xxl-job-admin:2.2.0
启动好后访问: localhost:8080/xxl-job-admin/ (要带 /xxl-job-admin 路径),默认 admin 123456
5.客户端业务服务SpringBoot,写定时任务
- 1.引入xxl-job-core
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
- 2.application.yml配置 xxl-job 服务端信息
xxl:
job:
accessToken:
admin:
addresses: http://192.168.6.1:8080/xxl-job-admin
executor:
appname: mobile-job
ip:
port: 9997
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: -1
address:
- 3.配置xxl-job bean
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Autowired
private InetUtils inetUtils;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
String ipAddress = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
logger.info(">>>>>>>>>>> xxl-job config init.");
logger.info(">>>>>>>>>>>appname:{}", appname);
logger.info(">>>>>>>>>>>adminAddresses:{}", adminAddresses);
logger.info(">>>>>>>>>>>address:{}", address);
logger.info(">>>>>>>>>>>ip:{}", ipAddress);
logger.info(">>>>>>>>>>>port:{}", port);
logger.info(">>>>>>>>>>>logRetentionDays:{}", logRetentionDays);
logger.info(">>>>>>>>>>>logPath:{}", logPath);
logger.info(">>>>>>>>>>>accessToken:{}", accessToken);
inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ipAddress);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
- 4.写定时任务业务代码
@Component
public class MobileJobhandler {
//统计任务服务
@Autowired
private StatisticTask statisticTask;
/**
* 统计定时任务 在xxl-job中设置该任务凌晨5:30点执行
* 使用XxlJob注解,里面的value=mobileTasks
* 在xxl-job web后台的任务管理的 JobHandler中对应填写 mobileTasks ,通过xxl-job执行时,就会调用该业务服务
* @return
*/
@XxlJob("mobileTasks")
public ReturnT<String> scheduledTasks(String param) {
//业务统计服务代码,就不列出来了
statisticTask.scheduledTasks();
return ReturnT.SUCCESS;
}
}
- 5.分布式任务调度平台调度业务服务中的任务,在xxl-job后台新增任务,里面定义好cron执行时间,该任务执行那个 JobHandler ,JobHandler="mobileTasks"与代码中@XxlJob(“mobileTasks”)对应
- 6.启动定时任务,状态就位RUNNING了,还可以查询任务日志
xxl-job的初步使用就分享这些了,具体的请看官方说明,很详情