直接交换不适用于默认的routingKey

时间:2012-12-26 13:32:38

标签: spring rabbitmq spring-integration

我不明白。 我正在使用Spring Integration来发送和接收来自RabbitMQ的消息。

我的拓扑非常简单:

  • 一个JVM使用RabbitTemplate of Spring生成消息

    <rabbit:template id="rabbitTemplate" connection-factory="rabbitConnectionFactory" />
    
    <bean id="amqpTemplate" parent="rabbitTemplate">
        <property name="queue" value="${queue.name}" />
        <property name="routingKey" value="${queue.name}" />
    </bean>
    
  • RabbitMQ队列收到消息

    <rabbit:queue name="${queue.name}" durable="true" />
    
  • 另一个JVM使用该消息(以启动Spring-Batch作业,但这不是重点):

    <int-amqp:inbound-channel-adapter
          queue-names="${queue.name}"
          channel="amqp-requests"
          connection-factory="rabbitConnectionFactory" />
    

使用的发送方法是:

/**
 * Convert a Java object to an Amqp {@link Message} and send it to a default exchange with a default routing key.
 * 
 * @param message a message to send
 * @throws AmqpException if there is a problem
 */
void convertAndSend(Object message) throws AmqpException;

它工作正常,但根据文档,我不认为routingKey在我的用例中是强制性的。我不知道为什么有人放了一个routingKey。

所以我试图删除routingKey:

<bean id="amqpTemplate" parent="rabbitTemplate">
    <property name="queue" value="${queue.name}" />
</bean>

然后我仍然可以将消息发送到队列,但它们永远不会被消耗掉! 有人可以解释一下发生了什么吗? 如果没有routingKey,我不能将消息从一个JVM发送到另一个JVM吗?

1 个答案:

答案 0 :(得分:3)

  

...但根据文档,我不认为routingKey是强制性的......

您指的是哪个“文档”?

对于AMQP,生产者不了解队列;他们将消息发送到各种类型的交换机,这些交换机具有路由到队列的绑定。

也许您误解了默认交换的概念,每个queue被约束,routing key等于其queue name

这允许简单路由到特定队列(通过其名称)。默认交换是为amqp消息传递提供快速入口的便利。这样可以正常工作,但您可能需要考虑使用显式声明的换向,因为它进一步将生产者与消费者分离。使用默认交换,生产者必须知道消费者正在侦听的队列的名称。

此外,在RabbitTemplate上,queue属性仅用于接收(消费)消息,它与发送消息无关;正如我所说,制作人不了解队列。

您应该使用以下内容......

<bean id="amqpTemplate" parent="rabbitTemplate">
    <property name="routing-key" value="${queue.name}" />
</bean>