Mule 2.2.6 - 处理 JMS 连接丢失的策略

Posted

技术标签:

【中文标题】Mule 2.2.6 - 处理 JMS 连接丢失的策略【英文标题】:Mule 2.2.6 - strategies for handling JMS connection loss 【发布时间】:2013-02-19 14:31:16 【问题描述】:

我使用的是 Mule 2.2.6,具有以下设置:

2 个服务器,每个服务器都有一个 ActiveMQ 实例 1 台运行 Mule 2.2.6 的服务器

现在,我有一项服务可以从一个 ActiveMQ 中获取消息,并将其放在另一个上。但是,当目标 ActiveMQ 关闭时,这会导致丢失消息的问题。然后,Mule 将从源 ActiveMQ 中获取一条消息,但在尝试将其放置在目标 AtiveMQ 上时遇到此异常:

ERROR [org.mule.DefaultExceptionStrategy] Caught exception in Exception Strategy: No JMS Connection 
java.lang.IllegalStateException: No JMS Connection
    at org.mule.transport.jms.JmsMessageDispatcher.doDispatch(JmsMessageDispatcher.java:81)
    at org.mule.transport.AbstractMessageDispatcher.dispatch(AbstractMessageDispatcher.java:105)
    at org.mule.transport.AbstractConnector$DispatchWorker.doRun(AbstractConnector.java:2561)
    at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:41)
    at org.mule.work.WorkerContext.run(WorkerContext.java:310)
    at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
    at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
    at java.lang.Thread.run(Thread.java:662)

一旦发生这种情况,消息就会丢失,远远低于可接受的范围。

在检查 mule 配置时,我注意到没有与将消息从一个 ActiveMQ 移动到另一个的服务相关联的 jms-transactions,但添加事务后,问题仍然存在。

配置:

ActiveMQ 连接器:

<jms:activemq-connector name="jmsConnectorOuter" specification="1.1"
    persistentDelivery="true" disableTemporaryReplyToDestinations="true" honorQosHeaders="true"
    numberOfConsumers="1" connectionFactory-ref="activeMqConnectionFactoryOuter" maxRedelivery="-1">
    <ee:retry-forever-policy frequency="5000" asynchronous="false" />
</jms:activemq-connector>

<jms:activemq-connector name="jmsConnector" specification="1.1"
    persistentDelivery="true" disableTemporaryReplyToDestinations="true" honorQosHeaders="true"
    numberOfConsumers="1" connectionFactory-ref="activeMqConnectionFactory" maxRedelivery="-1">
    <ee:retry-forever-policy frequency="5000" asynchronous="false" />
</jms:activemq-connector>

Jms 端点:

<endpoint name="queue.destination" address="jms://queue.destination" connector-ref="jmsConnector" />

<endpoint name="queue.source" address="jms://queue.source" connector-ref="jmsConnectorOuter" />

服务:

<service name="OuterActiveMQService">
    <inbound>
        <jms:inbound-endpoint ref="queue.source">
           <jms:transaction action="ALWAYS_BEGIN" timeout="60000" />
        </jms:inbound-endpoint>
    </inbound>

    <outbound>
        <pass-through-router>
            <jms:outbound-endpoint ref="queue.destination" />
        </pass-through-router>
    </outbound>
</service>

当与目标的 ActiveMQ 连接丢失时,如何确保消息不会丢失?

【问题讨论】:

【参考方案1】:

你需要添加:

<jms:transaction action="ALWAYS_JOIN" />

在出站 JMS 端点中使其加入事务。

【讨论】:

以上是关于Mule 2.2.6 - 处理 JMS 连接丢失的策略的主要内容,如果未能解决你的问题,请参考以下文章

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

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

使用 Mule 重新排队 JMS 请求

具有接收器线程配置文件配置的 Mule ActiveMQ JMS 组件不起作用

超过 jms Mule 最大重新投递

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