我创建了一个简单的消息发送者和消费者,并使用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"/>
答案 0 :(得分:2)
默认的replyTimeout是5秒。如果消费者在5秒内没有回复,则取消出站网关的消费者,删除临时队列。
您可以通过在&lt; rabbit:template /&gt;上配置回复超时来增加超时。 (毫秒)。