2009-06-22 86 views
2

實際上,JBoss確實發送了消息,但是隻有當EJB啓動的當前事務完成時才發送消息。JBoss不會發送JmsTemplate(Spring)消息

我們在JBoss 4.0.3和Spring的JmsTemplate中遇到了這個問題。 EJB將消息發送到具有臨時隊列的隊列作爲reply_to字段。然後,在同一個事務中,我們監聽第一個MDB給出的響應。問題是JmsTemplate的方法「send」在事務完成後不會被執行。所以,當消息被髮送到隊列並由MDB處理時,臨時隊列的偵聽器就消失了。

這就是所謂的「同步接收」

兩件事情改變這種行爲,但確實引起了一些擔憂:

  1. 更改EJB的事務類型到骨髓移植。 (關注:BMT糟糕)

  2. 創建一個線程,它所做的就是調用JmsTemplate.send()方法。

作爲一個方面說明,這是一個WebLogic環境正常工作的EJB,而當它應該在交易的中間不能當它已經結束了沒有被髮送的消息。

感謝您的任何幫助。

+0

這種行爲在我測試的每個JBoss版本上都是一樣的:4.2,5.0和5.1 – Eldelshell 2009-11-17 11:07:35

回答

1

JBoss的行爲是正確的。 JMS是一個事務性API,發送只應在tx提交時執行。

可能說服JmsTemplate不使用當前的事務上下文,儘管它試圖隱藏JMS API的不愉快之處。

+0

「並且發送只應在tx提交時執行」 但是這不允許使用任何可能的同步接收。 – Eldelshell 2009-06-22 09:40:10

+0

在交易的情況下,是的。但是如果你能說服JmsTemplate在該環境之外執行,那麼你應該沒問題。另外,不要使用JMSTemplate - 它只是JMS API的一個包裝。 – skaffman 2009-06-22 09:54:27

0

您可以使用事務傳播REQUIRES_NEW將代碼中的JMS模板包裝爲無狀態會話Bean或使用Spring事務管理的服務方法。這樣,消息的發送是在它自己的事務中進行的,它將承諾在包裝事務的範圍之外發送消息。

我不確定爲什麼這可以在Weblogic上工作。我的猜測是,在Weblogic上它不會將隊列識別爲XA隊列。