事件還原,最近在做一個項目善已,然后在提測階段褥影,測試提出說imei數(shù)據(jù)沒有同步池户。遠(yuǎn)程斷點排查少不了,發(fā)現(xiàn)有個事物回調(diào)方法sendImeiSynMsgByCount凡怎,會在事物成功提交后校焦,回調(diào)afterCommit()方法發(fā)送mq消息同步imei數(shù)據(jù)。發(fā)現(xiàn)afterCommit方法最后會被調(diào)用统倒,只是其中的imeiCenterPOList參數(shù)值為空了寨典,所以不會發(fā)送mq消息了。部分代碼如下
咦房匆,為什么參數(shù)會莫名其妙的不見了耸成,難道是異步事物回調(diào)的時候會把參數(shù)清理掉了注暗?沒轍,事物回調(diào)方法繼續(xù)打斷點墓猎,跟蹤下事物回調(diào)源碼。
第一次調(diào)試的時候赚楚,發(fā)現(xiàn)TransactionSynchronizationManager.getSynchronizations()里是有回調(diào)參數(shù)imeiCenterPOList的毙沾。但是這時候并沒有觸發(fā)invokeAfterCommit,因為沒有滿足條件宠页,事物回調(diào)只有在事物成功提交后才會觸發(fā)左胞。可是明明已經(jīng)走完了batchAddImei方法举户,而且沒有拋出異常烤宙,按道理應(yīng)該會成功提交事物的〖筻遥看下外部調(diào)用躺枕,果然外部方法里也做了事物注解。
繼續(xù)斷點供填,發(fā)現(xiàn)還是沒有觸發(fā)拐云,而且這時候TransactionSynchronizationManager.getSynchronizations()里依然是有回調(diào)參數(shù)imeiCenterPOList的。繼續(xù)向外找方法調(diào)用近她,果然最外層還嵌套了一層注解事物叉瘩。斷點后發(fā)現(xiàn),invokeAfterCommit觸發(fā)了粘捎,但是這時候TransactionSynchronizationManager.getSynchronizations()的回調(diào)參數(shù)imeiCenterPOList的值變?yōu)?了薇缅。
我們都知道注解式事物Propagation.REQUIRED是存在則繼承,不存在則創(chuàng)建的攒磨。所以最終的事物提交需要等最外層事物提交后泳桦,才會觸發(fā)事物提交。然后看下最外層方法是不是對imeiCenterPOList參數(shù)有操作娩缰,最后發(fā)現(xiàn)如下有個clear清理邏輯蓬痒。終于找到罪魁禍?zhǔn)住?/p>
最后解決:在sendImeiSynMsgByCount調(diào)用事物回調(diào)方法時,做參數(shù)復(fù)制漆羔。