我创建了一个简单的消息发送者和消费者,并使用 spring-integration 和 RabbitMq 将它们链接在一起。
我使用了出站网关和入站网关来创建 RPC(请求/响应)风格的消息传递。我没有指定回复通道,因为我将其留给 spring 来创建(我假设它将为回复创建一个匿名队列)。
当消费者在发送者之前启动时,这工作得很好,但如果消费者在发送者之后启动,我没有收到响应。我可以看到消费者收到了消息,但没有返回任何响应。
进一步检查,我可以看到发送者发送消息时在 rabbit 中创建了一个临时匿名队列,并且消息在回复标头中包含此队列名称。然而,在我启动消费者之前,这个队列在创建后不久就消失了。我猜随着队列不再存在,消费者无法发布对它的响应。
从rabbit管理工具可以看出,匿名队列设置为独占,自动删除设置为true。尽管队列是由弹簧集成创建的,但我无法控制这些属性。
有谁知道如何解决这个问题?我的配置如下:
发件人:
<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"/>