项目地址:https://gitee.com/xuxueli0323/xxl-job
一、源码下载及准备工作
点击克隆下载
下载完成后得到文件如下
用IDEA打开项目后
找到sql
文件,执行该数据库脚本
得到如下数据库
进入配置文件application.properties
修改为自己的数据库连接
启动admin
项目
浏览器打开链接http://127.0.0.1:8080/xxl-job-admin/jobinfo
初始账号为admin
,初始密码为123456
进入管理界面后可修改密码
二、SpringBoot项目集成XXL-JOB
打开自己的项目,导入xxl-job
依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
在配置文件中新增xxl-job
的配置
server.port=8088
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=127.0.0.1
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
然后新建一个config
配置类
写入下述配置信息(将配置文件中的配置读取)
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String addresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@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.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobSpringExecutor(){
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(addresses);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
新建一个定时任务job
包
写一个XxlJobDemo
@Component
public class XxlJobDemo {
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception{
System.out.println("执行定时任务时间" + new Date());
}
}
然后启动该项目,打开任务调度中心http://127.0.0.1:8080/xxl-job-admin/
可以看到已经上线了一个执行器
接下来就在该控制中心新建定时任务
任务管理
->新增
填表(带红色星号必填,注意JobHandler
就是@XxlJob("demoJobHandler")
中的demoJobHandler
,相当于url用于调度中心定位该任务)
点击启动
,任务就会每隔5秒被执行一次,如果点击执行一次
那么仅触发一次
可以看到任务已被触发执行
点击停止
,则停止任务执行
至此,xxl-job
的基础用法介绍完毕!
三、集群设置(选修)
点击该项目,克隆一个配置出来搭建本地集群
修改配置项和服务名称
-Dserver.port=8089 -Dxxl.job.executor.port=9999
点击+
,新增SpringBoot项目
假如,有一个任务,需要定时给下述用户发送邮件
搭建集群后,如何让两个服务合作完成,各自完成一半的工作量?
xxl-job中的XxlJobHelper.getShardIndex()
和XxlJobHelper.getShardTotal()
两个方法为每个机器提供了自身的索引编号和总的集群数量。
@XxlJob("sendMsgHandler")
public void sendMsgHandler() throws Exception{
long startTime = System.currentTimeMillis();
userMobilePlanService.sendMsgHandler();
System.out.println("任务耗时:" + (System.currentTimeMillis()-startTime) + "毫秒");
}
@Override
public void sendMsgHandler() {
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
System.out.println("分片的总数:" + shardTotal + ",分片的索引:" + shardIndex);
QueryWrapper<UserMobilePlan> wrapper = new QueryWrapper<>();
// 内存分流
List<UserMobilePlan> userMobilePlans = userMobilePlanMapper.selectList(null);
System.out.println("任务开始时间:" + new Date() + " 任务处理数量:" + userMobilePlans.size());
userMobilePlans.forEach(item -> {
if(item.getId() % shardTotal == shardIndex){
try{
// 模拟发送短信动作
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println("任务结束时间:" + new Date());
}
启动这两个服务
管理界面可看到两个在线服务
新增一个定时任务执行器
可以看到两个服务各处理了一半的工作量
假如重新编辑,不使用分片广播
策略
可以看到一个服务器处理了所有的数据