超过 jms Mule 最大重新投递

Posted

技术标签:

【中文标题】超过 jms Mule 最大重新投递【英文标题】:jms Mule max redelivery exceeded 【发布时间】:2012-10-09 22:24:20 【问题描述】:

我有非常简单的 MULE 从 HornetQ 队列读取并将对象保存到数据库的设置:

设置如下:

<jms:connector name="connector.jms" maxRedelivery="1" connectionFactory-ref="hornetQConnectionFactory" doc:name="JMS"
        createMultipleTransactedReceivers="true"
        numberOfConcurrentTransactedReceivers="100"
        acknowledgementMode="AUTO_ACKNOWLEDGE">
    <reconnect count="50" frequency="5000"/>       
</jms:connector>
<flow name="jmsListenerFlow1" doc:name="jmsListenerFlow1">
    <jms:inbound-endpoint queue="adsLogQueue" connector-ref="connector.jms" doc:name="JMS">
        <jms:transaction action="ALWAYS_BEGIN"/>
    </jms:inbound-endpoint>
    <component >
        <spring-object bean="logSaver"/>
    </component>

</flow>

为什么当 maxRedelivery 设置为 1 时,我会收到一条消息,指出消息已在端点上重新传递了 9 次?究竟是什么意思?

hornetQConnectionFactory:

        <bean name="hornetQTransportConfiguration" class="org.hornetq.api.core.TransportConfiguration">
        <constructor-arg value="org.hornetq.core.remoting.impl.netty.NettyConnectorFactory"/>
        <constructor-arg>
            <map>
                <entry key="host" value="$jms.host" /> 
                <entry key="port" value="$jms.port" /> 
            </map>
        </constructor-arg>

    </bean>
    <bean name="hornetQConnectionFactory" class="org.hornetq.jms.client.HornetQJMSConnectionFactory">
        <constructor-arg index="0" value="false"/>
        <constructor-arg index="1" ref="hornetQTransportConfiguration"/>
        <property name="minLargeMessageSize" value="250000"/>
        <property name="cacheLargeMessagesClient" value="false"/>
    </bean>

任何帮助将不胜感激!

下面的堆栈跟踪。

错误 2012-10-19 01:04:07,283 [Thread-3013 (HornetQ-client-global-threads-1442093417)]: 消息:“ID 为“ID:e6a0b303-1977-11e2-96d4-810571a3fe10”的消息已在端点“jms://adsLogQueue”上重新传递 9 次,超过了连接器“connector.jms”上的 maxRedelivery 设置 1。消息负载的类型:HornetQObjectMessage 代码:MULE_ERROR--2 异常堆栈是: 1.“ID为“ID:e6a0b303-1977-11e2-96d4-810571a3fe10”的消息已在端点“jms://adsLogQueue”上重新传递9次,超过了连接器“connector.jms”上的maxRedelivery设置1。消息负载的类型:HornetQObjectMessage (org.mule.transport.jms.redelivery.MessageRedeliveredException) org.mule.transport.jms.redelivery.JmsXRedeliveryHandler:91 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transport/jms/redelivery/MessageRedeliveredException.html) 根异常堆栈跟踪: org.mule.transport.jms.redelivery.MessageRedeliveredException:“ID 为“ID:e6a0b303-1977-11e2-96d4-810571a3fe10”的消息已在端点“jms://adsLogQueue”上重新传递 9 次,超出了 maxRedelivery 设置1 在连接器“connector.jms”上。消息有效负载的类型为:HornetQObjectMessage 在 org.mule.transport.jms.redelivery.JmsXRedeliveryHandler.handleRedelivery(JmsXRedeliveryHandler.java:91) 在 org.mule.transport.jms.MultiConsumerJmsMessageReceiver$JmsWorker.preProcessMessage(MultiConsumerJmsMessageReceiver.java:418) 在 org.mule.transport.AbstractReceiverWorker$1$1.process(AbstractReceiverWorker.java:120) + 3 个以上(设置调试级别日志记录或“-Dmule.verbose.exceptions=true”为所有内容) ****************************************************** ******************************

【问题讨论】:

你能分享一下hornetQConnectionFactory的配置吗? @genjosanzo 已添加 感谢您对此进行调查 您是否有多个 Mule 实例连接到同一个队列? @DavidDossot 嗨,是的,我有两个 mule 实例连接到生产上的同一个队列,尽管它也发生在我的本地环境中,其中只有一个 mule 连接到队列 【参考方案1】:

首先要注意的是,Mule 正在使用JmsXRedeliveryHandler,这意味着它检测到 HornetQ 支持 JMS_X_DELIVERY_COUNT 标头,并将负责计算重新交付的数量。在这种情况下,Mule 完全依赖 HornetQ 来提供准确的重新交付计数。

抛出此异常的事实意味着已向 Mule 提供了一条 JMS 消息,其重新传递计数超过了 JMS 连接器上配置的计数(在您的情况下为 1)。

由于您在事务中消费,可能会发生的情况是,HornetQ 将在每次重新启动时一次又一次地回滚并将此消息呈现给 Mule,除非您在 HornetQ 本身上配置了最大重新传递计数。

我的建议是:在 Mule 和 HornetQ 上设置相同的重新投递计数,或者在 Mule 上使用 -1(无限制)并完全依赖 HornetQ 的重新投递限制。

【讨论】:

以上是关于超过 jms Mule 最大重新投递的主要内容,如果未能解决你的问题,请参考以下文章

重新传递 Mule ESB 处理的失败的 activemq jms 消息时保留异常原因

Mule ESB HornetQ JMS 消息未传递

异常时的 Spring Integration 电子邮件重新投递

需要大消息的 HornetQ 配置帮助

Mule 4 - 如何为 JMS 连接器设置会话 ID

Mule ESB VM和JMS组件之间的主要区别是啥