我有一個運行在jboss上的spring web應用程序,當前配置爲使用HibernateTransactionManager用於db事務,JmsTransactionManager用於jms。對於jms我們使用Camel和ActiveMQ,我們的數據庫是DB2。在一個事務中,我需要向數據庫寫入一些記錄併發送兩個異步的jms消息。 jms消息是事件通知,我只希望在數據庫事務提交時發送它們。春季交易JDBC和JMS的同步
我願意接受在jdbc事務已經提交之後與代理通信失敗的風險(因此沒有發送消息但提交了數據庫),所以我不認爲我需要適當的XA。
我相信我需要的是使用spring事務同步的「盡力而爲」事務管理。
春天的文檔提示,spring會同步兩個事務,並在jdbc事務提交之後提交jms事務 - 但我不認爲它很清楚。這裏的春季文檔http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization沒有詳細說明它的工作原理。
我發現了一些其他的消息來源,說春天會做我想要的東西,包括一些javadoc下面,我寫了一些集成測試,也顯示它。
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransacted%28boolean%29 setSessionTransacted在這裏的javadoc聽起來就像我想要的。
從我所看到的,我認爲與成交套數設置爲這樣的真正的創造了駱駝JmsConfiguration足夠:
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="transacted" value="true"/>
<property name="concurrentConsumers" value="10"/>
</bean>
不過,我需要說服別人我誰是有點懷疑的工作,認爲我集成測試僅適用於記錄不良的副作用,而不是故意的彈簧功能。
所以我的問題是 - 我正確地認爲可以依靠spring來同步事務,並且始終在jdbc事務之後提交jms事務,或者這不是我應該依賴的事情,並且可以指向任何官方文件說清楚了嗎?我想一般來說,這是一個很好的方法來採取還是應該以不同的方式管理這些交易?
你好,你現在有答案嗎? – snowindy 2013-05-16 11:31:04
嗨,不,不是。我還沒有看到任何真正清晰的文檔,這是我想要的,但我們現在正在生產中使用它,沒有任何問題。 – laurie 2013-05-16 14:45:45