XXL 定时任务实现

下载地址: https://www.xuxueli.com/xxl-job/

中文文档: http://www.xuxueli.com/xxl-job/#/.

xxl-job控制台:

1、将下载好的源码zip包解压,获取初始化sql文件(xxl-job->doc->db->tables_xxl_job.sql),并执行

2、修改xxl-job-admin控制台项目下的application.perperties文件中的数据库链接信息

3、启动xxl-job-admin服务,访问http://localhost:8080/xxl-job-admin/toLogin,

进入xxljob的登录页面,账号默认admin,密码默认123456

XXL 定时任务实现_第1张图片

 

4、新增任务执行器: 任务执行器->新增执行器

XXL 定时任务实现_第2张图片

 

AppName:执行器集群的唯一标示, 和项目配置参数保持一致

注册方式

自动注册:调度中心通过底层注册表可以动态发现并加载执行器地址(http://127.0.0.1:9999);

手动录入:人工手动录入执行器的地址信息,多地址逗号分隔;

5、新增任务: 任务管理->新增

XXL 定时任务实现_第3张图片

 

 

路由策略:从开发角度看,主要分广播和非广播模式(单机)

Cron:触发任务执行的Cron表达式;

BEAN运行模式:任务以JobHandler方式维护在执行器端;

需要结合 “@XxlJob(“umHandler”)” 属性匹配执行器中任务;

JobHandler:运行模式为 “BEAN模式” 时生效,对应执行器中新开发的@XxlJob(“umHandler”)

方法“@XxlJob”注解自定义的value值;

阻塞处理策略

调度任务请求执行时,发现执行器存在运行中的任务

1、将此次请求放入先进先出的FIFO队列,此策略为单机串行(默认)

2、将此次请求丢弃并标记为失败,此策略为丢弃后续调度

3、终止运行中的调度任务并清空队列,然后运行当前调度任务,此策略为覆盖之前调度

子任务:当前主任务成功执行完毕后自动触发

执行参数:任务所需参数,多个参数用逗号分隔,任务执行时将会把多个参数转换成数组传入

常用路由策略对应开发代码示例

分片广播(通过分片参数进行多服务器分段处理) :

 
  
@Component

public class SampleXxlJob {


    @XxlJob("shardingJobHandler")
    public ReturnT shardingJobHandler(String param) throws Exception {

        // 分片参数

        ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();

        XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());                                     

        // 业务逻辑

        for (int i = 0; i < shardingVO.getTotal(); i++) {

            if (i == shardingVO.getIndex()) {

                XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);

            } else {

                XxlJobLogger.log("第 {} 片, 忽略", i);

            }

        }

        return ReturnT.SUCCESS;

    }

}

非分片模式(单机):(第一个、最后一个、轮询、随机、最不经常使用、故障转移等等)

 
  
@Component

public class SampleXxlJob {


    @XxlJob("demoJobHandler")

    public ReturnT demoJobHandler(String param) throws Exception {

        XxlJobLogger.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {

            XxlJobLogger.log("beat at:" + i);

            TimeUnit.SECONDS.sleep(2);
    
        }

        return ReturnT.SUCCESS;

    }

} 

你可能感兴趣的:(java)