2010-08-03 88 views
1

我被困在下面scenario.Please建議我在此線程和JMS事務

有站隊列 有一個主線程中運行(我們不使用JMS偵聽) 和採摘從消息隊列並處理消息 並啓動另一個子線程再次處理。

現在的問題是如何處理主線程和子線程中的事務。 這意味着當我處理主線程中的消息說一些數據庫訪問錯誤發生 所以我想回滾到入站隊列的消息。 ,如果在主線程創建的子線程中發生相同的故障,則檢索到的消息應回滾到入站隊列。

我已經通過JMS Spring參考走過,但他們劃定的交易才JMS聽衆

那麼,如何應用事務的概念在我的情況

請諮詢我,如果您有任何示例程序請與我分享。那樣會更好地理解你的概念

回答

0

如果我理解的很好,你有一個主線程可以獲取消息,併產生其他線程進行處理。

JMS支持多個偵聽器以事務處理方式同時獲取消息。這實際上是JMS的好處之一:您可以進行事務處理,併發消息傳遞。

所以我建議你使用線程池,每個線程都有自己的監聽器。線程獲取消息並在一個事務中處理它,然後循環。這樣,如果處理失敗,則消息保留在隊列中。每個線程都有一個監聽器,因此您不再需要主線程。

否則,用於Message Driven Bean的goolge,並查看Spring是否支持某種類似的概念。

2

我認爲你在這裏困難的領土。在同一筆交易中有兩條線索在我看來充滿了競爭條件和其他危險 - 事實上我甚至不確定這是可能的。我熟悉的JTA事務API使用從線程到事務的一對一映射。

爲什麼你不能擁有一個線程池,每個線程從隊列中獲取消息並完成所有工作。然後,接收到消息後,不需要新線程。你可以得到同樣好的並行性和更大的簡單性。

然後您發現您已經有效地重新創建了標準的Java方法。那麼爲什麼不使用MDB呢?