XXL-JOB的阻塞处理策略-单机串行机制

问题

默认的单机串行策略,是指的是在xxl-job调度时串行,还是指具体的执行器串行?

  • 纠结这个问题的起源是在使用xxl-job的时候,配置了两台执行器,这两台执行器的代码是一样的,且JOB的工作是拉取表中特定状态的数据进行处理
  • 结果发现部分数据被重复处理,原因是xxl-job在执行器a未执行完毕的情况下,启动了执行器b,此时执行器a中未被修改状态的数据就同时被两台执行器处理

结论

  • xxl-job的默认处理策略是单机串行,这里串行指的是具体执行器上面的同一个任务串行
  • 如果配置了多个执行器(即多节点),且没有通过入参控制job获取的处理数据,则最好调整路由策略为
    hash一致性,这种路由会均匀的将job分散在不同的执行器,且同一个任务永远在一台服务器上执行

验证过程

  • 编写两个执行器,代码相同,具体逻辑为线程休眠20s,同时使用xxl-job配置这两台执行器,调度频率为每10s一次,单机串行-轮询
  • 发现在执行未执行完毕的情况下,xxl-job到了下次执行时间,直接调度执行器b,此时该定时任务实际在两个执行器并行
执行器代码
public class JobHandler {

    @XxlJob("jobTest")
    public ReturnT<String> jobTest(String param) throws InterruptedException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
        simpleDateFormat.applyPattern("YYYY-MM-DD HH:mm:ss");
        log.info("====job===   begin!"+simpleDateFormat.format(new Date()));
        Thread.sleep(20000);
        log.info("====job===   end!"+simpleDateFormat.format(new Date()));
        return ReturnT.SUCCESS;
    }
}
执行器配置
xxl:
  job:
    admin:
      # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
      addresses: 
    executor:
      # 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
      appname: 
      address:
      # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
      ip:
      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
      port: 
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logpath: #日志路径也需要区分开,默认的日志文件命名规则会让两个执行器同时操作一个文件,出现错误
      logretentiondays: 30
    # 执行器通讯TOKEN [选填]:非空时启用;
    accessToken: 
参考官方文档
GitHub 加速计划 / xx / xxl-job
27.16 K
10.79 K
下载
xxl-job: 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。
最近提交(Master分支:3 个月前 )
e5d26ba2 - 4 个月前
977ad87b - 4 个月前
Logo

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

更多推荐