xxl:许雪里 —美团大神
原项目中的需求是通过xxl-job定时计算用户行为得出文章热度,再根据文章热度排名,需求不复杂,所以这篇文章重点讲解ruoyi cloud plus中给出的xxl-job的几个实例。

启动服务

xxl-job服务端在ruoyi cloud plus中内置,直接配置好数据库启动即可:
image.png

找到ruoyi-job微服务

ruoyi cloud plus中已经包含了一个用于学习的ruoyi-job微服务:
image.png

配置多实例启动

先不要直接启动,简单修改下配置:
image.png
新建了一个执行器,这个主要是为了测试,用原来的也可以。
port原来是写死的,这里改成参数启动,默认9901
ruoyi-job的application.yml中的server.port也改成参数的:
image.png
这样一来就可以多实例启动了
image.pngimage.png

引入依赖

pom中引入:
image.png

源码中的例子

SampleService.java,里面有五个例子:
1、简单任务示例 2、分片广播任务 3、命令行任务 4、跨平台Http任务 5、生命周期任务示例

简单任务示例

通过例子,会发现使用起来很方便,直接在需要配置任务的方法上方加入注解即可:
image.png
控制台中新增任务:
image.png

注意和注解中的名字对应,路由那里我选择的是轮询,可通过多实例启动看效果。
image.png

启动服务:
image.png

分片广播任务

我把原来的例子改成了黑马教程中的例子,需求是通过两个实例,把一个从1打印到10000的任务分成两个片区执行,原理就是通过取模运算,和shardIndex一致后,执行任务即可,shardIndex和执行器管理的OnLine机器地址中的最前面的序号一致:
image.png

/**
     * 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;
    }

执行一次即可,我新建了分片执行器,需要选择正确,配置中也要保证一致:
如果没有这个执行器,可以新建一个:
image.png
image.png
执行结果:分成两片,一个尾号是单数,一个尾号是双数:
image.png
image.png

命令行任务

该任务可以运行参数中的一个执行文件
比如,在c盘根目录创建了一个叫做a.bat的可执行文件:
c:/a.bat

@echo  off
start https://www.baidu.com/s?wd=xxljob

执行后,会打开百度:
image.png
image.png

跨平台Http任务

该任务可以接收一个跨平台的http数据或者传输数据,三个参数:url(不可为空) method(不可为空) data(可选)
执行一次即可

参数:

url: https://www.sina.com.cn
method: get
data: content

image.png

接收到的数据,新浪首页的数据,你给人家输出了好多啊!
image.png
方法中把返回数据存到了XxlJobHelper.log中,控制台看不到,想看需要手打sysout或者log.info
image.png
XxlJobHelper.log的数据可以通过调度日志看到
image.png
通过操作中的执行日志可以看明细,这里数据太大了,出不来了
image.png

换个参数,把url换成已经停服的北美新浪:
url: http://www.sina.com
method: get

这样就出来了!

image.png生命周期任务

任务初始化与销毁时,支持自定义相关逻辑;

@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");
}

第二阶段完成。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐