【发布时间】:2015-06-07 10:58:26
【问题描述】:
org.springframework.jms.listener.AbstractMessageListenerContainer 的 Javadoc 状态,如果
“sessionAcknowledgeMode”设置为“CLIENT_ACKNOWLEDGE”:监听执行成功后自动消息确认;抛出异常时不重新投递。
我猜,“在抛出异常的情况下不重新传递”意味着,即使 jms 侦听器中抛出异常,该消息也不会被重新传递(所以,我猜,它会被确认)。但是,监听器抛出的异常意味着对它的调用不成功,并且由于没有确认而应该重新传递。
问题是:
如果 jms 侦听器中抛出异常,消息确认实际上应该发生什么?
真正发生的事情,可以从这个堆栈跟踪中看出:
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:98)
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:66)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:660)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:620)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:591)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
堆栈跟踪的第 5 行特别有趣。那里的代码基本上意味着,(大部分)从侦听器抛出的任何异常都将绕过在org.springframework.jms.listener.AbstractMessageListenerContainer#commitIfNecessary 中完成的确认。
没关系,但是“在抛出异常的情况下不重新投递”是什么意思呢?
附加信息:
弹簧-jms:4.1.2
<bean id="someListenerContainerFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="concurrency" value="1-10"/>
<property name="sessionAcknowledgeMode">
<util:constant static-field="javax.jms.Session.CLIENT_ACKNOWLEDGE"/>
</property>
</bean>
【问题讨论】:
标签: java spring spring-jms