1

I am using Mule 2.2.6, with the following setup:

2 servers, each with an instance of ActiveMQ 1 server running Mule 2.2.6

Now, I have a service that picks up a message from one ActiveMQ, and places it on the other. But, this is leading to problems with lost messages when the target ActiveMQ is down. Then, Mule will pick up a message from the source ActiveMQ, but run into this exception upon trying to place it on the destination 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)

Upon this happening, the message is just lost, which is way below what is acceptable.

When examining the mule configuration, I noticed that there were no jms-transactions associaited with the service that moves messages from one ActiveMQ to the other, but after adding a transaction, the problem remained the same.

Configuration:

ActiveMQ connectors:

<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-endpoints:

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

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

Service:

<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>

What can be done to make sure that messages aren't lost when the ActiveMQ connection to the destination is lost?

4

1 に答える 1

2

追加する必要があります:

<jms:transaction action="ALWAYS_JOIN" />

アウトバウンドJMSエンドポイントで、トランザクションに参加させます。

于 2013-03-05T16:10:16.807 に答える