傳送訊息 缺少 更新的欄位值
阿新 • • 發佈:2020-11-27
背景
先看一段程式碼:
@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的執行的時間點 隨機了 沒有必然的 先後順序了。