XXL-JOB的阻塞处理策略-单机串行机制
问题
默认的单机串行策略,是指的是在xxl-job调度时串行,还是指具体的执行器串行?文章来源地址https://www.toymoban.com/news/detail-543077.html
- 纠结这个问题的起源是在使用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:
参考官方文档
文章来源:https://www.toymoban.com/news/detail-543077.html
到了这里,关于XXL-JOB的阻塞处理策略-单机串行机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!