XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4

一 调度模式分类

1.1 调度模式

1.单个任务:一个任务实例便可完成

a)单机单任务:单机模式下任何路由模式都只有一个实例执行

b)集群单任务:由路由策略(广播模式除外)选择其中一个实例完成

2.集群部署:每个实例都同时执行一部分数据。分片方式:取模分片,范围分片。现使用xxljob进行分片任务执行,有两种解决思路。

a)单机多任务分片:单机模式下,创建同类型任务多个任务计划,手工分片数据作为参数。

 1.自定义业务规则,配置多个xxl任务,来实现分片功能。

 2.每个任务指定不同的参数,但使用相同的jobhanlder:

b)集群任务分片:只有广播模式会通知所有实例都会运行,每个节点取模执行任务

注意:单机模式:只启动一个任务执行器实例,修改路由模式即便是广播模式依然只有一个实例运行job

集群模式:启动多个任务实例,这里可以把每个实例的端口号都改为不同,可以看到同一个任务类有多个机器。除了广播模式,其他模式都只会选择机器列表中的一个执行job。

XXL-JOB任务分片 - 灰信网(软件开发博客聚合)

3.流程截图如下:

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第1张图片

1.2 案例说明

1.2.1 需求说明

假设有5个地市,每个地市有10个订单执行,总共50个订单,而每个订单中又有一个字段体现出地市信息。

XXL-JOB任务分片_xxljob分片-CSDN博客

1.3 同一实例并行运行的设置

1.同一个实例,通过修改服务端口,并行启动的设置。

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第2张图片

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第3张图片

二 案例模式1单机模式

2.1 思路

 单机单任务:单机模式下任何路由模式都只有一个实例执行

2.1 编写代码

package com.ljf.xxl.job.task;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.*;

import static com.xxl.job.core.biz.model.ReturnT.FAIL_CODE;

/**
 * @ClassName: SingleTask
 * @Description: TODO
 * @Author: admin
 * @Date: 2023/10/13 20:52:26 
 * @Version: V1.0
 **/
@Component
public class SingleTask {
    private Logger log = LoggerFactory.getLogger( SingleTask.class);
    @XxlJob(value = "singleTasks", init = "init", destroy = "destroy")
    public ReturnT execute(String cities) {
        String param = XxlJobHelper.getJobParam();
        System.out.println("v2 param=" + param);
        XxlJobHelper.log("v2 param=" + param);
        System.out.println("获取cities 参数:==================="+cities);
        if (StringUtils.isEmpty(param)) {
            return new ReturnT(FAIL_CODE, "latnIds不能为空");
        }
        //处理
        if (param != null && param.length() > 0) {
            String cityArray[] = param.split(",");
            for (int k = 0; k < cityArray.length; k++) {
              //  Integer cityId = Integer.parseInt(cityArray[k]);
               String cityId= cityArray[k];
                List infoList = dbMap.get(cityId);
                infoList.stream().forEach((x) -> {
                  // System.out.println("【"+Thread.currentThread().getName()+"】执行【{"+cityId+"}】,任务内容为:{"+x+"}" );
                    log.info("【"+Thread.currentThread().getName()+"】执行【{"+cityId+"}】,任务内容为:{"+x+"}");
                  // XxlJobHelper.log("【"+Thread.currentThread().getName()+"】执行【{"+cityId+"}】,任务内容为:{"+x+"}");
                });
            }
        }
        return ReturnT.SUCCESS;
    }
    private void init() {

        log.info("init 方法调用成功");

    }

    private void destroy() {
        log.info("destroy 方法调用成功");
    }
    static List cityNoList=null;
    static int cityTaskNum=0;
    //数据库
    static Map> dbMap=null;
    static {
        dbMap=new HashMap<>();
        //城市编号
        cityNoList= Arrays.asList("010","0755","0371","0373","0375");
        //任务数
        cityTaskNum=10;
        for(int k=0;k tasksList = new ArrayList<>();
            for(int m=1;m<=cityTaskNum;m++){
                tasksList.add("执行任务"+m);
            }
            dbMap.put(cityNoList.get(k)+"",tasksList);
        }
    }

}

2.2 配置单机模式

2.2.1 配置执行器

执行器设置为:xxl-single-dingsi

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第4张图片

2.2.2 配置调度任务

1.选择任务管理

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第5张图片

2.进行任务的配置

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第6张图片

2.3 启动服务查看效果

2.3.1 程序配置启动

server.port=8083;  job.port=9993 ;执行器设置为:xxl-single-dingsi;(填写系统页面配置的执行器名称),然后进行启动

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第7张图片

2.3.2 查看log日志

所有的任务都指在一个任务实例中执行。

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第8张图片

三 案例模式2单机多分片任务

3.1 思路

单机多任务分片:单机模式下,创建同类型任务多个任务计划,手工分片数据作为参数。

 1.自定义业务规则,配置多个xxl任务,来实现分片功能。

 2.每个任务指定不同的参数,但使用相同的jobhanlder:

3.2 调度配置规则

 1.自定义业务规则,配置多个xxl任务,来实现分片功能。这里配置两个任务使用相同的执行器【单机多任务分片】,两个job任务使用相同 jobhandler: singleTasks

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第9张图片

2.任务id为6的配置:路由策略手动分配为:第一个;jobhandler为:singleTasks

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第10张图片

3.任务id为8的配置: 路由策略手动分配为:最后一个;jobhandler为:singleTasks

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第11张图片

 3.2 查看效果

分别启动两个任务,查看执行日志:

3.2.1 端口8084任务1

1.在idea中服务端口设置:server.port=8084;  job.port=9994 ;执行器设置为:xxl-single-dingsi(填写系统页面配置的执行器名称),然后进行启动

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第12张图片

2.执行结果如下: 分配到的任务是 【010,0755】

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第13张图片

 3.2.2 端口8083任务2

1.在idea中服务端口设置:server.port=8083;  job.port=9993 ;执行器设置为:xxl-single-dingsi(填写系统页面配置的执行器名称),然后进行启动

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第14张图片

2.执行结果如下: 分配到的任务是 【0371,0373,0375】 

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第15张图片

 3.2.3 查看执行器的执行实例

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第16张图片

四 案例模式3多机分片任务 

4.1 思路

采用多机器取模的方式,来为不同的机器指定各自服务的城市列表。

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第17张图片

4.2 编写多机分片代码

1.编写代码

package com.ljf.xxl.job.task;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.*;

import static com.xxl.job.core.biz.model.ReturnT.FAIL_CODE;

/**
 * @ClassName: BatchTask
 * @Description: TODO
 * @Author: admin
 * @Date: 2023/10/14 11:09:10 
 * @Version: V1.0
 **/
@Component
public class BatchTask {
    private Logger log = LoggerFactory.getLogger(BatchTask.class);
    @XxlJob(value = "batchTasks", init = "init", destroy = "destroy")
    public ReturnT execute(String cities) {
        String param = XxlJobHelper.getJobParam();
        System.out.println("进来了param:"+param);
        //当前的执行器编号
        int shardIndex = XxlJobHelper.getShardIndex();
        //总的分片数,就是执行器的集群数量
        int shardTotal = XxlJobHelper.getShardTotal();
        log.info("分片总数:{},当前分片数{}",shardTotal,shardIndex);
        //处理
        for(int m=0;m infoList = dbMap.get(cityId);
                final int n=m;
                infoList.stream().forEach((x) -> {
                    log.info("任务索引编号"+n+"【"+Thread.currentThread().getName()+"】执行【{"+cityId+"}】,任务内容为:{"+x+"}");
                });
            }
            else{
                log.info("========不在本分片执行的任务序号m:{},当前分片索引:{}",m,shardIndex);
            }

        }
        return ReturnT.SUCCESS;
    }
    private void init() {

        log.info("init 方法调用成功");

    }

    private void destroy() {
        log.info("destroy 方法调用成功");
    }
    static List cityNoList=null;
    static int cityTaskNum=0;
    //数据库
    static Map> dbMap=null;
    static {
        dbMap=new HashMap<>();
        //城市编号
        cityNoList= Arrays.asList("010","0755","0371","0373","0375");
        //任务数
        cityTaskNum=10;
        for(int k=0;k tasksList = new ArrayList<>();
            for(int m=1;m<=cityTaskNum;m++){
                tasksList.add("执行任务"+m);
            }
            dbMap.put(cityNoList.get(k)+"",tasksList);
        }
    }
}

4.3 配置执行器

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第18张图片

4.4 配置调度任务

1.这里的路由模式为: 分片广播,jobhhandler为:BatchTask

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第19张图片

如图

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第20张图片 4.5 启动实例任务

4.5.1 分片0号端口8085任务1

1.在idea中服务端口设置:server.port=8085;  job.port=9995 ;执行器设置为:xxl-batch-dingsi

(填写系统页面配置的执行器名称),然后进行启动

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第21张图片

2.执行结果如下: 0号分片分配到的任务是:编号0,编号3,不满足是:编号1,编号2,编号4;

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第22张图片

4.5.2 分片1端口8086任务2

1.在idea中服务端口设置:server.port=8086;  job.port=9996 ;执行器设置为:xxl-batch-dingsi

(填写系统页面配置的执行器名称),然后进行启动

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第23张图片

2.执行结果如下: 1号分片分配到的任务是:编号1,编号4,不满足是:编号0,编号2,编号3;

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第24张图片

4.5.3 分片2端口8087任务3

1.在idea中服务端口设置:server.port=8086;  job.port=9996 ;执行器设置为:xxl-batch-dingsi

(填写系统页面配置的执行器名称),然后进行启动

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第25张图片

2.执行结果如下: 2号分片分配到的任务是:编号2,不满足是:编号0,编号1,编号3,编号4;

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第26张图片

4.5.4 任务启动先后对分片数影响

实例1,实例2,实例3 这3个不同的任务实例,陆续启动,可以通过log日志看到,分片总数在动态变化,实现动态监控加载。

初始监控到2个分片

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第27张图片

后续等3个都启动起来后,监控到3个分片 :

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第28张图片

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4_第29张图片

你可能感兴趣的:(任务调度,分布式)