xxl:许雪里 —美团大神
原项目中的需求是通过xxl-job定时计算用户行为得出文章热度,再根据文章热度排名,需求不复杂,所以这篇文章重点讲解ruoyi cloud plus中给出的xxl-job的几个实例。
启动服务
xxl-job服务端在ruoyi cloud plus中内置,直接配置好数据库启动即可:
找到ruoyi-job微服务
ruoyi cloud plus中已经包含了一个用于学习的ruoyi-job微服务:
配置多实例启动
先不要直接启动,简单修改下配置:
新建了一个执行器,这个主要是为了测试,用原来的也可以。
port原来是写死的,这里改成参数启动,默认9901
ruoyi-job的application.yml中的server.port也改成参数的:
这样一来就可以多实例启动了
引入依赖
pom中引入:
源码中的例子
SampleService.java,里面有五个例子:
1、简单任务示例 2、分片广播任务 3、命令行任务 4、跨平台Http任务 5、生命周期任务示例
简单任务示例
通过例子,会发现使用起来很方便,直接在需要配置任务的方法上方加入注解即可:
控制台中新增任务:
注意和注解中的名字对应,路由那里我选择的是轮询,可通过多实例启动看效果。
启动服务:
分片广播任务
我把原来的例子改成了黑马教程中的例子,需求是通过两个实例,把一个从1打印到10000的任务分成两个片区执行,原理就是通过取模运算,和shardIndex一致后,执行任务即可,shardIndex和执行器管理的OnLine机器地址中的最前面的序号一致:
/**
* 2、分片广播任务
*/
@XxlJob("shardingJobHandler")
public void shardingJobHandler(){
//分片的参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
//业务逻辑
int i = 0;
List<Integer> list = getList();
for (Integer integer : list) {
if(integer % shardTotal == shardIndex){
log.info("当前第"+shardIndex+"分片执行了,任务项为:"+integer);
i++;
}
}
log.info("执行完成,任务总量:10000,本分片共执行了 {} 次",i);
}
public List<Integer> getList(){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(i);
}
return list;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
执行一次即可,我新建了分片执行器,需要选择正确,配置中也要保证一致:
如果没有这个执行器,可以新建一个:
执行结果:分成两片,一个尾号是单数,一个尾号是双数:
命令行任务
该任务可以运行参数中的一个执行文件
比如,在c盘根目录创建了一个叫做a.bat的可执行文件:
c:/a.bat
@echo off
start https://www.baidu.com/s?wd=xxljob
1
2
执行后,会打开百度:
跨平台Http任务
该任务可以接收一个跨平台的http数据或者传输数据,三个参数:url(不可为空) method(不可为空) data(可选)
执行一次即可
参数:
url: https://www.sina.com.cn
method: get
data: content
1
2
3
接收到的数据,新浪首页的数据,你给人家输出了好多啊!
方法中把返回数据存到了XxlJobHelper.log中,控制台看不到,想看需要手打sysout或者log.info
XxlJobHelper.log的数据可以通过调度日志看到
通过操作中的执行日志可以看明细,这里数据太大了,出不来了
换个参数,把url换成已经停服的北美新浪:
url: http://www.sina.com
method: get
这样就出来了!
生命周期任务
任务初始化与销毁时,支持自定义相关逻辑;
@XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")
public void demoJobHandler2() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
}
public void init(){
logger.info("init");
}
public void destroy(){
logger.info("destory");
}
1
2
3
4
5
6
7
8
9
10
第二阶段完成。
————————————————
版权声明:本文为CSDN博主「zhaozhiqiang1981」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhaozhiqiang1981/article/details/129240377