欧洲某第三方仓库,现场反馈某个工作站,车辆到站,但无实操任务,页面业务任何报错。

按经验,第一时间怀疑到站推实操的 mq 监听出问题了。

先看任务状态:等待实操。也就是说没有推送成功,但小车调度系统其实已经推送到站消息了。

但奇怪的是,这个等待实操状态的任务已经卡在这个状态几分钟了。正常业务逻辑中,这个任务状态的流转会非常快。

大概率问题出在这个任务了。

根据唯一任务 ID 查了一下上下文日志,并没有明显报错。

再按照时间线细看流程,有一个诡异的点,任务状态先完结,后面又被更新为等待实操。

查看任务状态变更表:从已回滚状态转变为了等待实操。

至此已经开始怀疑是不是出现了多线程 ABA 问题。

查看任务更新线程:都是 mq 线程。

  1. 工作站下线 mq 监听:将任务状态改为回滚状态
  2. 到站等待推实操监听:将任务状态改为等待实操

看代码才发现这个老旧系统数据库更新压根就没做状态限制和乐观锁……

导致工作站下线 mq 监听回滚完任务之后,到站等待推实操监听又把任务回滚到等待实操状态了。

许多智能仓工作站下线都是到下班把任务都做完之后才下线,所以不会出现这个问题。今天属于中途下线,把问题暴露出来了。

修复方案也比较简单,到站等待实操监听中更新任务状态时只更新非终点状态的任务,并加上版本号。