Spring Integration - 创建匿名队列

时间:2013-06-17 11:04:29

标签: spring rabbitmq message-queue

问题: 我正在使用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"  />  

非常感谢任何帮助。感谢。

2 个答案:

答案 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,一个匿名队列和一个传入队列适配器。