org.springframework.jms.listener.adapter.ListenerExecutionFailedException
is thrown if there is an exception thrown from the JMS listener. When sessionAcknowledgeMode
is set to CLIENT_ACKNOWLEDGE
, the message would still be acknowledged even if there is an exception thrown in the listener, which means that no redelivery would occur. However, if the exception is not caught and wrapped in a RuntimeException
, the message would remain unacknowledged and redelivery would be attempted.
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
中执行的确认操作。
没关系,但是“发生异常时不重新传递”是什么意思?
附加信息:
spring-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>
CLIENT_ACKNOWLEDGE
仍然没有任何改变。 我正在使用DefaultMessageListenerContainer
。 根据Javadocs,CLIENT_ACKNOWLEDGE
意味着容器将在成功执行监听器后为我执行确认。 - borodustCLIENT_ACKNOWLEDGE
意味着您需要负责调用Message.acknowledge()
。请阅读 JMS 规范。 - Gary Russellorg.springframework.jms.listener.AbstractMessageListenerContainer#commitIfNecessary
,您可以清楚地看到,在侦听器执行后,它会自动为我执行确认操作。 是否这是正确的行为并不重要,因为容器javadoc明确指出了这一点。 - borodustJmsTemplate.execute()
。 - Gary Russell