【发布时间】:2014-10-18 19:17:23
【问题描述】:
我正在尝试将消息发布到队列,然后让某些消费者仅在它包含某个标头时才使用它,如果它包含另一个标头,则另一个消费者使用它。
到目前为止,我所做的是设置一个标头交换,仅当消息包含该标头时才将消息路由到某个队列。
这是我用来设置交换、队列和监听器的配置:
<!-- 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 的键和 action3 的值将 myqueue 绑定到 myexchange。
现在当我在交易所发布时:
即使操作设置为 action1 而不是 action3,ChannelAwareMessageListener 仍在使用它
public class Action implements ChannelAwareMessageListener {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
System.out.println(message.toString());
}
}
要么我没有正确使用 headers-exchange,要么我没有正确配置它 - 有什么建议吗?
【问题讨论】:
标签: java spring rabbitmq spring-amqp