问题: 我正在使用RabbitMQ支持的Spring Integration。我有一个发布消息的扇出交换。我希望启动相同服务的多个实例,这些实例创建一个绑定到此交换的队列。当消息发布到此交换时,我希望所有已启动的服务都接收消息。这不会发生,因为虽然有多个服务,但它们都使用相同的队列
解决方案: 为每个使用者创建一个非持久的,独占的匿名队列。
问题: 如何使队列匿名?
到目前为止,这是我的代码,问题是绑定需要一个队列属性,并且队列需要一个名称 - 因此被命名,而不是匿名。
<rabbit:fanout-exchange id="structureUpdateExchange" name="publish.registry.update" >
<rabbit:bindings>
<rabbit:binding queue="publish.registry.update.queue" />
</rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:queue durable="false" auto-delete="true" exclusive="true" name="publish.registry.update.queue" />
<si:channel id="publishInformationChannel" />
<int-amqp:inbound-gateway request-channel="publishInformationChannel"
queue-names="publish.registry.update.queue" />
非常感谢任何帮助。感谢。
答案 0 :(得分:1)
所以是的,正如菲利普所说的那样,用id而不是名字来定义队列。
<rabbit:queue id="queueTemp"/>
您需要使用SpEL来引用队列名称。请参阅下面的queue-names属性:
<int-amqp:inbound-channel-adapter
channel="fromRabbit"
queue-names="#{@queueTemp.name}"
connection-factory="connectionFactory" />
您可能已经这样做但请注意,在消费者方面,您还可以使用与临时队列的绑定来定义扇出交换。如下所示:
<rabbit:fanout-exchange id="myFanoutExchange" name="test-fanex" >
<rabbit:bindings>
<rabbit:binding queue="queueTemp" />
</rabbit:bindings>
</rabbit:fanout-exchange>
答案 1 :(得分:0)
您可以直接定义由AMQP队列支持的频道:
<int-amqp:publish-subscribe-channel id="publishInformationChannel"
exchange="publish.registry.update" />
这将为频道publish.registry.update
创建一个交换publishInformationChannel
,一个匿名队列和一个传入队列适配器。