仅使用RabbitMQ和SpringAMQP消耗具有特定标头的消息

时间:2014-08-25 15:27:22

标签: java spring rabbitmq spring-amqp

我正在尝试将消息发布到队列,然后让某些消费者仅在它包含某个标题时使用它,如果它包含另一个标题,则另一个消费者使用它。

到目前为止,我所做的是设置一个header-exchange,只有当它包含该标题时才将消息路由到某个队列。

enter image description here

这是我用来设置交换机以及队列和监听器的配置:

<!-- Register Queue Listener Beans -->
<bean id="ActionMessageListener" class="com.mycee.Action" />    

<!-- Register RabbitMQ Connections -->
<rabbit:connection-factory 
    id="connectionFactory"
    port="${rabbit.port}"
    virtual-host="${rabbit.virtual}" 
    host="${rabbit.host}" 
    username="${rabbit.username}"
    password="${rabbit.password}" 
    connection-factory="nativeConnectionFactory" />

<!-- Register RabbitMQ Listeners -->
<rabbit:listener-container          
    connection-factory="connectionFactory"
    channel-transacted="true"
    requeue-rejected="true"
    concurrency="${rabbit.consumers}">
    <rabbit:listener queues="${queue.myqueue}" ref="ActionMessageListener" method="handle"/>        
</rabbit:listener-container>    

<!-- Setup RabbitMQ headers exchange -->
<rabbit:headers-exchange id="${exchange.myexchange}" name="${exchange.myexchange}">
    <rabbit:bindings>
        <rabbit:binding queue="${queue.myqueue}" key="action" value="action3" />            
    </rabbit:bindings>
</rabbit:headers-exchange>

<rabbit:admin connection-factory="connectionFactory"/>  
<rabbit:queue name="${queue.myqueue}" />

所以我使用action of action和action3的值将myqueue绑定到myexchange。

现在,当我在交易所发布时:

enter image description here

ChannelAwareMessageListener正在使用它,即使该操作设置为action1而不是action3

public class Action implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        System.out.println(message.toString());

    }

}

要么我没有正确使用标头交换,要么我没有正确配置 - 任何建议?

1 个答案:

答案 0 :(得分:2)

它不起作用;每个消费者需要一个单独的队列。请参阅the tutorial

当多个消费者从同一队列消费时,他们竞争所有消息;你不能在消费者一方选择消息; “选择”由交换通过将消息路由到特定队列来完成。