2016-04-11 96 views
0

我的項目中有JMS隊列實現,我在其中一個事務中發送100個消息,但在將其放入隊列之前執行一些數據庫操作。即在發送JMS隊列之前提交消息

//SuedoCode 

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void sendMsg(List orders) 
{ 
    for(Order order : orders) 
    { 
    order.setStatus("SENT"); 
    sendToQueue(order); 
    } 

} 

但是這個交易仍然沒有提交,並且接收方在提交發件人的交易之前拿起訂單。現在,接收方處理消息並再次改變狀態,然後提交,但在發送方事務提交之後,它覆蓋不應該發生的狀態。

因此,爲了解決其具有方法來改變的順序的狀態這個問題我創建了一個新類(對於彈簧代理),並且此方法是在REQUIRES_NEW交易這樣的狀態已改變,但如果任何錯誤發生而發送消息再次排隊然後狀態需要改變(因爲之前的事務已經提交)。 請給我建議如果這種方法是正確的或者可以做更好的事情。 在此先感謝

回答

0

排隊的消息需要成爲同一事務的一部分,以便所有內容都立即提交。

缺乏這一點,另一種解決方案是將更新的訂單存儲在列表中,並在您確認事務已提交且數據庫已更新後立即在此方法外調用sendToQueue。