背景
先看一段代码:
@Transactional(rollbackFor = Exception.class)
public boolean cancel(OrderRequest request) {
long start = System.currentTimeMillis();
String orderId = request.getOrderId();
String operator = request.getOperator();
String cancelMsg = request.getCancelMsg();
....
//1,更新 calcelMsg 到 order
updateCancelMsg(cancelMsg, order);
//notify
//2、从order中获取 cancleMsg 直接发送消息。 是@Async 方法
asynTaskService.notify(orderId,ORDER_CANCEL);
//修正
// asynTaskService.notifyOss(orderId, cancelMsg, ORDER_CANCEL);
//3、其他业务逻辑
...
} catch (Exception e) {
...
} finally {
...
}
return true;
}
从这个代码中 能 发现问题吗?
在本地 调试的时候,没有发现问题,在测试环境 三方联调的时候, 基本是 必现的问题。问题反馈后,有调式,没问题....。检查了所有环境,配置,jar。 问题肯定是存在的。重新 审视代码。
排查
步骤一;
打log。 在回调信息中,吧 获取到的 cancleMsg 和order信息打印出来。
确实发现了问题。
获取时的时间 早于 更新 驳回消息的时间。这就是问题所有。
步骤二:
回归代码,查找问题的根源。
@Transactional
@Async
这个方法中使用了 Transactional, 并且 notify 方法用了异步。
Transactional 的存在,使 更新 cancelMsg 的 commit 时间点 延后了,
异步化,是 notify的执行的时间点 随机了 没有必然的 先后顺序了。