为什么 DefaultMessageListenerContainer 强烈推荐使用 sessionTransacted

mab*_*abn 4 java spring activemq-classic jms spring-jms

DefaultMessageListenerContainer 的Javadoc说

强烈建议将“sessionTransacted”设置为“true”或指定外部“transactionManager”。

为什么强烈推荐?这个神秘建议的背后是什么?

Eri*_*ams 5

如果您的会话没有被处理,您可能会在 JVM 意外停机时丢失消息。

下面是对 AbstractMessageListenerContainer 的各种 ack 模式的解释:

侦听器容器提供以下消息确认选项:

"sessionAcknowledgeMode" set to "AUTO_ACKNOWLEDGE" (default): Automatic message acknowledgment before listener execution; no redelivery in case of exception thrown.
"sessionAcknowledgeMode" set to "CLIENT_ACKNOWLEDGE": Automatic message acknowledgment after successful listener execution; no redelivery in case of exception thrown.
"sessionAcknowledgeMode" set to "DUPS_OK_ACKNOWLEDGE": Lazy message acknowledgment during or after listener execution; potential redelivery in case of exception thrown.
"sessionTransacted" set to "true": Transactional acknowledgment after successful listener execution; guaranteed redelivery in case of exception thrown. 
Run Code Online (Sandbox Code Playgroud)

确切的行为可能会因所使用的具体侦听器容器和 JMS 提供程序而异。

由于消息传递通常基于有保证的传递,因此建议使用可提供最佳保护措施以防止消息丢失的方法。您必须决定一个特定的用例是否值得。