一、环境准备
下载镜像
docker pull xuxueli/xxl-job-admin:2.1.2
初始化数据库
通过xxl-job-admin/doc/db中的脚本初始化数据库
源码地址:https://github.com/xuxueli/xxl-job.git
启动服务
启动参数中设置数据库连接地址等,其中spring.mail.username为报警邮件的发送方spring.mail.password为邮箱的授权码,需到邮箱中设置,默认spring.mail.port为25,由于阿里云禁用25端口,所以如果服务部署在阿里云上,这个端口需要修改为465或者587
docker run
-e PARAMS="--spring.datasource.url=jdbc:mysql://数据库IP:数据库端口/xxl_job?Unicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
--spring.mail.username=报警邮箱
--spring.mail.password=报警邮箱授权码
--spring.datasource.username=数据库账号
--spring.datasource.password=数据库密码
--spring.mail.port=587"
-p 8082:8080 -v /home/xxl-job/logs:/data/applogs --name xxl-job-admin -d 镜像ID
调度中心高可用
由于接入调度中心后,所有项目的定时任务都由调度中心接管,所以必须避免调度中心出现单点故障
xxl-job-admin的高可用不需要引入额外配置,只需要启动多个节点,并且连接同一数据库即可,不同节点通过对数据库加锁的形式,保证只有一台调度中心发起调用,即不会出现任务多次执行
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
大体流程是通过以上代码,先对数据加锁,然后查询需要执行的定时任务(未来5秒内),放入执行队列,再更新定时任务下一次的执行时间,最后释放锁。这样其他调度中心再来查询的时候,定时任务的执行时间已经更新了,所以不会出现重复执行的情况
二、项目接入
POM依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.1.2</version>
</dependency>
配置文件
#调度中心
xxl:
job:
accessToken: ''
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
appname: 项目名
ip: ''
logpath: /data/applogs/xxl-job/项目名
logretentiondays: 30
port: 9999
配置类
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
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;
}
}
定时任务
方法上添加@XxlJob注解,返回类型为ReturnT<>,入参String(所在类要纳入Spring容器,如添加@Component注解)
@XxlJob("任务名")
public ReturnT<String> demoJob(String param) {
......
任务逻辑
......
return ReturnT.SUCCESS;
}
调度中心新建执行器
登录调度中心:http://localhost:8080/xxl-job-admin
默认账号/密码 :admin/123456
执行器管理 -> 新建执行器
AppName为配置文件中的appname,注册方式选择自动注册,只有自动注册的执行器,才会动态更新实例清单,维持心跳(30秒一个心跳,90秒内没有心跳的实例会从清单中删除)
新建好执行器后,启动我们的项目,可以看到在执行器列表已经注册了自己的IP
调度中心新建任务
任务管理 -> 新建任务
选择执行器,运行模式选择Bean,jobHandler填@XxlJob注解的value值,cron设置任务执行时间,根据需要选择路由策略和阻塞处理策略(如无特殊需求,路由策略推荐轮询,阻塞处理策略推荐丢弃后续度),并设置重试次数,以及报警邮件接收方地址(多个地址逗号隔开,报警地址为空则不报警)
启动任务
状态更新为RUNNING
调度日志
通过调度日志,可以查看任务的执行情况