2017-02-24 53 views
0

要求: 我們需要從JMS隊列(由不同的應用程序發佈)檢索消息並將消息保存在我們的JMS隊列中。需要整個流程是事務性的,以防萬一消息不能保存在下游JMS隊列中,那麼從上游JMS隊列接收的消息就不應該被確認。 我的配置是如下應該在從一個JMS隊列持久化到另一個JMS隊列時使用JmsTransactionManager

<int-jms:message-driven-channel-adapter 
    id="MessageDrivenAdapter" channel=" jmsMessageChannel " destination="sourceDestination" 
    connectionFactory="CF1" 
acknowledge="transacted" 
    /> 

<int:channel id=" jmsMessageChannel " /> 
<int-jms:outbound-channel-adapter id="sendsomemsg" 
    channel=" jmsMessageChannel " destination=」finalDestination」 
    connectionFactory="CF2" 
    session-transacted="true" /> 

我需要在這種情況下使用一個JmsTransactionManager或者應該是上面的配置足矣。我們可以處理重複的消息,所以我相信我們不需要XA事務。

回答

2

您在這裏肯定需要XA事務,因爲您正在使用幾個單獨的事務資源。即使他們都是JMS,這並不意味着他們可以分享交易。

OTOH您可以嘗試一種解決方案,如ChainedTransactionManager和第二個鏈接JmsTransactionManager s - 每個JMS資源一個。

更多的信息在Dave Syer的article

+0

這些組件正在使用相同的連接工廠。 –

+0

連接工廠不同。編輯過代碼。所以相信會需要使用JmsTransactionManager – vjm

+0

不,如果您發現「ChainedTransactionManager」複雜,您需要'JtaTransactionManager'或任何其他XA實現。共享的單個'JmsTransactionManager'不適用於你的情況。 –

0

只要您不切換到另一個線程(隊列通道,任務執行程序),並且兩個組件都使用相同的連接工廠,則出站操作將與入站相同的事務運行 - 底層JmsTemplate在出站適配器中將使用與偵聽器容器傳遞消息相同的會話。

+0

連接工廠不同。編輯過代碼。所以相信會需要使用JmsTransactionManager – vjm