2

问题: 我正在使用由 RabbitMQ 支持的 Spring Integration。我有一个发布消息的 Fanout Exchange。我希望启动同一服务的多个实例,这会创建一个绑定到此交换的队列。当一条消息发布到这个交换器时,我希望所有启动的服务都能接收到该消息。这不会发生,因为虽然有多个服务,但它们都使用相同的队列

解决方案: 为每个消费者创建一个非持久的、独占的、匿名的队列。

问题: 如何使队列匿名?

到目前为止,这是我的代码,问题是绑定需要一个队列属性,而队列需要一个名称 - 因此是命名的,而不是匿名的。

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

任何帮助将不胜感激。谢谢。

4

2 回答 2

1

所以是的,正如 Phillipp 所说,用 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>
于 2013-11-20T01:51:42.790 回答
0

您可以直接定义由 AMQP 队列支持的通道:

<int-amqp:publish-subscribe-channel id="publishInformationChannel"
      exchange="publish.registry.update" />

这将为通道创建一个交换publish.registry.update、一个匿名队列和一个传入队列适配器publishInformationChannel

于 2013-08-17T08:43:47.507 回答