使用Spring-JMS,可以通過DefaultMessageListenerContainer在外部事務上下文中接收消息。使用TransactionManager使用Spring JmsTemplate編寫消息
然而唯一記載的方式來寫一個消息是通過JmsTemplate.send(…)
,我看不出這可怎麼強制使用給定TransactionManager
。
任何人都可以指向正確的方向嗎?
更多信息:確保一個事務管理器可用(WebSphereUowTransactionManager
),在使用JmsTemplate.write
針對Oracle AQjmsFactory.getQueueConnectionFactory(dataSource)
結果:
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is oracle.jms.AQjmsException: could not use local transaction commit in a global transaction
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:534)
Caused by: oracle.jms.AQjmsException: could not use local transaction commit in a global transaction
at oracle.jms.AQjmsSession.commitNoCheck(AQjmsSession.java:1053)
at oracle.jms.AQjmsSession.commit(AQjmsSession.java:1021)
at org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217)
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:573)
at org.springframework.jms.core.JmsTemplate$3.doInJms(JmsTemplate.java:536)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:466)
... 24 more
Caused by: java.sql.SQLException: could not use local transaction commit in a global transaction
at oracle.jdbc.driver.PhysicalConnection.disallowGlobalTxnMode(PhysicalConnection.java:6647)
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:3635)
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:3680)
at oracle.jdbc.OracleConnectionWrapper.commit(OracleConnectionWrapper.java:133)
at oracle.jms.AQjmsSession.commitNoCheck(AQjmsSession.java:1049)
... 29 more
因此,雖然我沒有理由懷疑下面的提醒,我無法測試它,因爲我無法弄清楚如何讓AQ JMS不嘗試提交。隨着我學習更多,將會更新。
謝謝。我想知道,當另一個非Spring過程啓動時,Spring是否能夠找到正在運行的事務?我明天會發現... – Synesso 2011-05-12 07:34:20
@Synesso:是的,會的。JTA事務由容器管理,而不是由Spring管理。 – skaffman 2011-05-12 07:38:37