首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMS侦听器中异常的JMS消息重传

JMS侦听器中异常的JMS消息重传
EN

Stack Overflow用户
提问于 2015-04-02 13:08:14
回答 1查看 7K关注 0票数 4

org.springframework.jms.listener.AbstractMessageListenerContainer状态的Javadoc,如果

"sessionAcknowledgeMode“设置为"CLIENT_ACKNOWLEDGE":成功执行侦听器后自动消息确认;异常抛出时不进行重新传递。

我猜,“在异常抛出的情况下没有重新传递”意味着该消息将不会被重新传递(因此,我的猜测,它将被确认),即使在jms侦听器中抛出了异常。但是,从侦听器抛出的异常意味着对它的调用没有成功,并且应该因为没有确认而重新传递。

问题是:

在jms侦听器中抛出异常时,消息确认实际上应该发生什么?

从这个堆栈跟踪中可以看到真正发生的事情:

代码语言:javascript
复制
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中执行的应答。

,好吧,但是"no redelivery exception “是什么意思呢?

更多信息:

spring-jms:4.1.2

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2015-04-02 15:45:50

这取决于您使用哪个侦听器容器;当使用自动ack模式时,侦听器返回后的SimpleMessageListenerContainer将返回(即传统的MessageListener)。在调用侦听器之前,DefaultMessageListenerContainer会关闭,因此您需要acknowledgeMode="transacted"来防止消息丢失。

这个领域的javadocs有点误导,并且是最近有所改善

有了CLIENT_ACKNOWLEDGE,你就可以自己动手了。那个医生只是说你只是随心所欲的经纪人。根据JMS消息javadoc:

已收到但未确认的邮件可重新发送。

根据我的经验,最好在SMLC中使用auto ack,对DMLC使用事务处理。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29413784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档