如何在从Mule发布到RabbitMQ时不丢失消息,直到正确的;“确认”;收到了吗?

如何在从Mule发布到RabbitMQ时不丢失消息,直到正确的;“确认”;收到了吗?,rabbitmq,mule,amqp,jms-topic,Rabbitmq,Mule,Amqp,Jms Topic,我有一个同步的Mule流,它读取来自sonic主题的消息并发布到Rabbit exchange 当兔子被举起/放下时,我正在失去信息。 Rabbit exchange正在发布到HA队列。 在从兔子代理收到正确的“Ack”之前,我如何确保Mule没有使用消息? 这里是流程图 <jms:connector name="sonicMQConnectorSub" validateConnections="true" connectionFactory-ref="factorySub" doc:na

我有一个同步的Mule流,它读取来自sonic主题的消息并发布到Rabbit exchange

当兔子被举起/放下时,我正在失去信息。 Rabbit exchange正在发布到HA队列。 在从兔子代理收到正确的“Ack”之前,我如何确保Mule没有使用消息? 这里是流程图

<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
2014-04-22 09:49:29453-org.mule.exception.defaultsystemexception策略-错误-
********************************************************************************
消息:检测到:AMQP的连接关闭
代码:MULE_错误--2
--------------------------------------------------------------------------------
异常堆栈是:
1.软件导致的连接中止:recv失败(java.net.SocketException)
java.net.SocketInputStream:-2(空)
2.连接错误;原因:java.net.SocketException:软件导致的连接中止:recv失败(com.rabbitmq.client.ShutdownSignalException)
com.rabbitmq.client.impl.AMQConnection:715(空)
3.检测到的连接关闭: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)
--------------------------------------------------------------------------------
根异常堆栈跟踪:
java.net.SocketException:软件导致的连接中止:recv失败
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(SocketInputStream.java:150)
位于java.net.SocketInputStream.read(SocketInputStream.java:121)
+3个以上(为所有内容设置调试级别日志或“-Dmule.verbose.exceptions=true”)
********************************************************************************
2014-04-22 09:49:29453-org.mule.exception.DefaultSystemExceptionStrategy-INFO-捕获的异常是ConnectException,正在尝试重新连接。。。
2014-04-22 09:49:29454-org.mule.lifecycle.AbstractLifecycleManager-INFO-停止连接器:AMQP
2014-04-22 09:49:29454-org.mule.lifecycle.AbstractLifecycleManager-INFO-停止:“AMQP.dispatcher.1064499250”。对象是:AmqpMessageDispatcher
2014-04-22 09:49:29454-org.mule.lifecycle.AbstractLifecycleManager-INFO-Disposing:'AMQP.dispatcher.1064499250'。对象是:AmqpMessageDispatcher
2014-04-22 09:49:29455-org.mule.transport.amqp.AmqpConnector-错误-清除连接关闭;原因:尝试使用关闭的连接
2014-04-22 09:49:29461-org.mule.transport.amqp.AmqpConnector-INFO-Connected:AmqpConnector
{
名称=AMQP
生命周期=停止
这=33c5919e
ConcurrentTransacticedReceiver的数量=4
CreateMultipleTransactedReceiver=true
已连接=真
supportedProtocols=[amqp]
服务覆盖=
}
2014-04-22 09:49:29461-org.mule.transport.amqp.AmqpConnector-信息-起始:AmqpConnector
{
名称=AMQP
生命周期=停止
这=33c5919e
ConcurrentTransacticedReceiver的数量=4
CreateMultipleTransactedReceiver=true
已连接=真
supportedProtocols=[amqp]
服务覆盖=
}
2014-04-22 09:49:29461-org.mule.lifecycle.AbstractLifecycleManager-INFO-启动连接器:AMQP
已于2003年4月更新,但将JMS事务添加到AMQP出站端点时收到异常:

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]
消息:未找到endpoint:DefaultOutboundEndpoint{endpointUri的活动AMQP事务=amqp://rabbitExchange,connector=AmqpConnector
{
名称=AMQP
生命周期=开始
这=25ec1ff7
ConcurrentTransacticedReceiver的数量=4
CreateMultipleTransactedReceiver=true
已连接=真
supportedProtocols=[amqp]
服务覆盖=
}
,name='endpoint.amqp.rabbitExchange',mep=ONE_-WAY,properties={exchangeDurable=true,exchangeType=fanout},transactionConfig=Transaction{factory=org.mule.transport.jms。JmsTransactionFactory@6491b172,action=ALWAYS\u JOIN,timeout=30000},DeleteUnceptedMessages=false,initialState=started,responseTimeout=10000,endpointEncoding=UTF-8,disableTransportTransformer=false}
代码:MULE_错误--2
--------------------------------------------------------------------------------
根异常堆栈跟踪:
org.mule.transaction.IllegalTransactionStateException:未找到端点DefaultOutboundEndpoint{endpointUri的活动AMQP事务=amqp://rabbitExchange,connector=AmqpConnector
{
名称=AMQP
生命周期=开始
这=25ec1ff7
ConcurrentTransacticedReceiver的数量=4
CreateMultipleTransactedReceiver=true
已连接=真
supportedProtocols=[amqp]
服务覆盖=
}
,name='endpoint.amqp.rabbitExchange',mep=ONE_-WAY,properties={exchangeDurable=true,exchangeType=fanout},transactionConfig=Transaction{factory=org.mule.transport.jms。JmsTransactionFactory@6491b172,action=ALWAYS\u JOIN,timeout=30000},DeleteUnceptedMessages=false,initialState=started,responseTimeout=10000,endpointEncoding=UTF-8,disableTransportTransformer=false}
位于org.mule.transport.amqp.AmqpMessageDispatcher.getEventChannel(AmqpMessageDispatcher.java:298)
位于org.mule.transport.amqp.AmqpMessageDispatcher.doOutboundAction(AmqpMessageDispatcher.java:152)
位于org.mule.transport.amqp.AmqpMessageDispatcher.doDispatch(AmqpMessageDispatcher.java:127)
+3个以上(为所有内容设置调试级别日志或“-Dmule.verbose.exceptions=true”)
********************************************************************************
2014-04-23 10:52:03178-org.mule.transport.jms.jmtransaction-警告-已尝试事务回滚,但没有资源绑定到org.mule.transport.jms。JmsTransaction@d4ac3d8f-caf6-11e3-bf9a-8b266a026dee[状态=状态\标记\回滚,键=空,资源=空]
我看到两个选项: