sessionTransacted和JmsTransactionManager之间的区别

Ary*_*rya 5 java spring jms spring-jms

使用sessionTransacted = true(在JmsTemplate和/或DefaultMessageListenerContainer中)与使用JmsTransactionManager之间的主要区别是什么?对于JmsTemplate和DefaultMessageListenerContainer用法,使用sessionTransacted = true是否足够?(我不需要XA)

该文档说(在JmsAccessor的setSessionTransacted方法中),看来应该不成问题:

将此标志设置为“ true”将在托管事务之外运行时使用简短的本地JMS事务,如果存在托管事务(XA事务除外),则将使用同步的本地JMS事务。

Gar*_*ell 4

正确的。

DefaultMessageListenerContainer(DMLC)通常只需要acknowledgemode=transacted;仅当需要将 JMS 事务与 JDBC 事务同步或者需要使用平台 (JTA) 事务管理器时,才需要在 DMLC 上使用事务管理器。

此外,JmsTemplate容器线程上的任何下游操作都将在同一会话中完成并参与事务。

同样,对于JmsTemplate非容器线程的线程上的操作,通常不需要事务管理器,除非平台需要它。

  • 当同步 JMS 和 JDBC 事务时,您可以将“JDBC”事务管理器(不是 JMS tx 管理器)添加到侦听器容器中;然后,事务管理器将通过在 JMS tx 之前立即提交 DB tx 来同步事务。JMS 提交可能会失败,因此您需要处理重复的消息传递。 (2认同)