具有Spring集成和RabbitMQ的持久RPC

具有Spring集成和RabbitMQ的持久RPC,rabbitmq,amqp,spring-integration,Rabbitmq,Amqp,Spring Integration,我创建了一个简单的消息发送者和消费者,并使用spring集成和RabbitMq将它们链接在一起 我使用出站网关和入站网关来创建RPC(请求/响应)样式的消息传递。我没有指定回复通道,因为我将把它留给spring来创建(我假设它将为回复创建一个匿名队列) 当消费者在发送者之前启动时,这种方法可以很好地工作,但是如果消费者在发送者之后启动,我不会收到响应。我可以看到消费者收到消息,但没有返回响应 进一步检查后,我可以看到,当发送方发送消息时,在rabbit中创建了一个临时匿名队列,并且消息在repl

我创建了一个简单的消息发送者和消费者,并使用spring集成和RabbitMq将它们链接在一起

我使用出站网关和入站网关来创建RPC(请求/响应)样式的消息传递。我没有指定回复通道,因为我将把它留给spring来创建(我假设它将为回复创建一个匿名队列)

当消费者在发送者之前启动时,这种方法可以很好地工作,但是如果消费者在发送者之后启动,我不会收到响应。我可以看到消费者收到消息,但没有返回响应

进一步检查后,我可以看到,当发送方发送消息时,在rabbit中创建了一个临时匿名队列,并且消息在reply to报头中包含此队列名称。然而,这个队列在创建后不久即消失,在我启动消费者之前。我猜想,由于队列不再存在,消费者无法发布对它的响应

我可以从rabbit管理工具中看到,匿名队列被设置为独占队列,自动删除被设置为true。我无法控制这些属性,因为队列是由spring集成创建的

有人知道如何解决这个问题吗?我的配置如下:

发件人:

<import resource="classpath:rabbit.xml" />

<int:channel id="output" />

<int:gateway id="senderGateway" service-interface="gordon.outbound.SenderGateway" default-request-channel="output"/>

<int-amqp:outbound-gateway request-channel="output"
                                   amqp-template="amqpTemplate" exchange-name="silly-wabbit-exchange"
                                   routing-key="silly-wabbit-key"/>

消费者:

<import resource="classpath:rabbit.xml" />

<int:channel id="input"/>

<int-amqp:inbound-gateway request-channel="input" queue-names="silly-wabbit-queue" connection-factory="connectionFactory"/>

<bean id="listenerService" class="gordon.inbound.ListenerService"/>

<int:service-activator input-channel="input" ref="listenerService" method="receiveMessage"/>

默认的replyTimeout为5秒。如果使用者在5秒内没有应答,则出站网关的使用者将被取消,从而删除临时队列


您可以通过在(毫秒)上配置回复超时来增加超时。

谢谢,我已经更改了此值,并且可以看到您所说的行为。我仍然感到困惑的是,我的客户端代码如何知道回复已超时,因为我无法看到在此实例中引发异常。您还需要在senderGateway上添加默认回复超时。消息网关上的默认“默认回复超时”是无限的,因此您的调用线程将阻止等待来自amqp网关的回复,而amqp网关的回复永远不会到来。当senderGateway超时时,您的调用线程将得到一个超时异常。谢谢,工作正常,尽管我似乎得到的是null而不是异常。gateway文档中提到了这一点,所以我会想一想;网关在超时的情况下返回null。