具有Spring Integration和RabbitMQ的持久RPC

时间:2012-10-24 15:41:45

标签: rabbitmq amqp spring-integration

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

我使用了outbound-gateway和inbound-gateway来创建RPC(请求/响应)样式消息传递。我没有指定回复频道,因为我要将其留给Spring创建(我假设它将为回复创建一个匿名队列)。

当在发件人之前启动使用者时,这可以正常工作,但如果在发件人之后启动使用者,则我没有收到响应。我可以看到消费者收到消息但没有返回任何响应。

进一步检查时,我可以看到当发件人发送邮件时,在Rabbit中创建了一个临时匿名队列,并且该邮件在reply-to标头中包含此队列名称。但是,在我启动消费者之前,此队列在创建后不久就会消失。我猜测,随着队列不再存在,消费者无法发布对它的响应。

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

有没有人对如何解决这个问题有任何想法?我的配置如下:

发信人:

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

1 个答案:

答案 0 :(得分:2)

默认的replyTimeout是5秒。如果消费者在5秒内没有回复,则取消出站网关的消费者,删除临时队列。

您可以通过在&lt; rabbit:template /&gt;上配置回复超时来增加超时。 (毫秒)。