如何在从Mule发布到RabbitMQ之前不会丢失消息,直到正确的" Ack"收到了?

时间:2014-04-21 16:49:13

标签: rabbitmq mule amqp jms-topic

我有一个同步的Mule流程,它从声音主题中读取消息并发布到Rabbit交换。

当兔子上下移动时,我正在丢失消息。 Rabbit exchange正在发布到HA队列。 我怎样才能确保Mule不会消息,直到正确的#A; Ack"是从Rabbit Broker收到的吗? 这是流程。

<jms:connector name="sonicMQConnectorSub" validateConnections="true" connectionFactory-ref="factorySub" doc:name="JMS" clientId="testClient" durable="true" maxRedelivery="-1" >
     <reconnect-forever frequency="30000"/>
</jms:connector>
<spring:beans>
    <spring:bean id="soniqMQConnectionFactoryBeanSub" name="factorySub" class="progress.message.jclient.ConnectionFactory">
        <spring:property name="connectionURLs" value="tcp://server1:7800" />
        <spring:property name="defaultUser" value="user" />
        <spring:property name="defaultPassword" value="pass" />
    </spring:bean>
</spring:beans>

<amqp:connector name="AMQP" validateConnections="true" host="server2" fallbackAddresses="server3" doc:name="AMQP Connector" port="5672" mandatory="true" activeDeclarationsOnly="true">
    <reconnect-forever frequency="30000"/>
</amqp:connector>


<flow name="rabbitFlow1" doc:name="rabbitFlow1" processingStrategy="synchronous">
    <jms:inbound-endpoint doc:name="JMS" connector-ref="sonicMQConnectorSub" topic="testtopic"/>

    <logger message="Message: #[message.payload]" level="INFO" doc:name="Logger"/>

    <amqp:outbound-endpoint exchangeName="rabbitExchange" exchangeDurable="true" responseTimeout="10000" connector-ref="AMQP" doc:name="AMQP" exchangeType="fanout"/>
 </flow>

更新时间:04/22

这是Mule连接到第二个代理时的异常跟踪。这是我丢失信息的时候。

2014-04-22 09:49:29,453 - org.mule.exception.DefaultSystemExceptionStrategy - ERROR -
********************************************************************************
Message               : Connection shutdown detected for: AMQP
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Software caused connection abort: recv failed (java.net.SocketException)
java.net.SocketInputStream:-2 (null)
2. connection error; reason: java.net.SocketException: Software caused connection     abort: recv failed (com.rabbitmq.client.ShutdownSignalException)
com.rabbitmq.client.impl.AMQConnection:715 (null)
3. Connection shutdown detected for: AMQP (org.mule.transport.ConnectException)
org.mule.transport.amqp.AmqpConnector$1:502     (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transport/ConnectException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

2014-04-22 09:49:29,453 - org.mule.exception.DefaultSystemExceptionStrategy - INFO -    Exception caught is a ConnectException, attempting to reconnect...
2014-04-22 09:49:29,454 - org.mule.lifecycle.AbstractLifecycleManager - INFO - Stopping   connector: AMQP

2014-04-22 09:49:29,454 - org.mule.lifecycle.AbstractLifecycleManager - INFO -   Stopping: 'AMQP.dispatcher.1064499250'. Object is: AmqpMessageDispatcher
2014-04-22 09:49:29,454 - org.mule.lifecycle.AbstractLifecycleManager - INFO -  Disposing: 'AMQP.dispatcher.1064499250'. Object is: AmqpMessageDispatcher
2014-04-22 09:49:29,455 - org.mule.transport.amqp.AmqpConnector - ERROR - clean  connection shutdown; reason: Attempt to use closed connection
2014-04-22 09:49:29,461 - org.mule.transport.amqp.AmqpConnector - INFO - Connected:    AmqpConnector
{
name=AMQP
lifecycle=stop
this=33c5919e
numberOfConcurrentTransactedReceivers=4
createMultipleTransactedReceivers=true
connected=true
supportedProtocols=[amqp]
serviceOverrides=<none>
}

2014-04-22 09:49:29,461 - org.mule.transport.amqp.AmqpConnector - INFO - Starting:   AmqpConnector
{
name=AMQP
lifecycle=stop
this=33c5919e
numberOfConcurrentTransactedReceivers=4
createMultipleTransactedReceivers=true
connected=true
supportedProtocols=[amqp]
serviceOverrides=<none>
}

2014-04-22 09:49:29,461 - org.mule.lifecycle.AbstractLifecycleManager - INFO - Starting  connector: AMQP

在JMS事务添加到AMQP出站端点时收到异常时更新了04/23:

Message               : No active AMQP transaction found for endpoint:      DefaultOutboundEndpoint{endpointUri=amqp://rabbitExchange, connector=AmqpConnector
{
name=AMQP
lifecycle=start
this=25ec1ff7
numberOfConcurrentTransactedReceivers=4
createMultipleTransactedReceivers=true
connected=true
supportedProtocols=[amqp]
serviceOverrides=<none>
}
,  name='endpoint.amqp.rabbitExchange', mep=ONE_WAY, properties={exchangeDurable=true,     exchangeType=fanout}, transactionConfig=Transaction   {factory=org.mule.transport.jms.JmsTransactionFactory@6491b172, action=ALWAYS_JOIN,   timeout=30000}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}
Code                  : MULE_ERROR--2

--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.transaction.IllegalTransactionStateException: No active AMQP transaction  found for endpoint: DefaultOutboundEndpoint{endpointUri=amqp://rabbitExchange,   connector=AmqpConnector
{
name=AMQP
lifecycle=start
this=25ec1ff7
numberOfConcurrentTransactedReceivers=4
createMultipleTransactedReceivers=true
connected=true
supportedProtocols=[amqp]
serviceOverrides=<none>
}
,  name='endpoint.amqp.rabbitExchange', mep=ONE_WAY, properties= {exchangeDurable=true, exchangeType=fanout}, transactionConfig=Transaction {factory=org.mule.transport.jms.JmsTransactionFactory@6491b172, action=ALWAYS_JOIN,  timeout=30000}, deleteUnacceptedMessages=false, initialState=started,   responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}
at org.mule.transport.amqp.AmqpMessageDispatcher.getEventChannel(AmqpMessageDispatcher.java:298)
at org.mule.transport.amqp.AmqpMessageDispatcher.doOutboundAction(AmqpMessageDispatcher.java:152)
at org.mule.transport.amqp.AmqpMessageDispatcher.doDispatch(AmqpMessageDispatcher.java:127)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

2014-04-23 10:52:03,178 - org.mule.transport.jms.JmsTransaction - WARN - Transaction   rollback attempted, but no resource bound to   org.mule.transport.jms.JmsTransaction@d4ac3d8f-caf6-11e3-bf9a-8b266a026dee  [status=STATUS_MARKED_ROLLBACK, key=null, resource=null]

1 个答案:

答案 0 :(得分:1)

我看到两个选项:

  • 使JMS客户端成为一个持久的客户端,并在事务上使用testtopic,因此如果amqp:outbound-endpoint失败,将重新传递该消息。
  • amqp:outbound-endpoint包裹until-successful以重试出站调度,直到AMQP连接器重新连接到RabbitMQ。