1

我有些不明白。我正在使用 Spring Integration 从 RabbitMQ 发送和接收消息。

我的拓扑很简单:

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

    <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 发送消息吗?

4

1 回答 1

3

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

您指的是哪个“文档”?

使用 AMQP,生产者不知道队列;他们将消息发送到各种类型的交换器,这些交换器具有路由到队列的绑定。

也许你误解了默认交换的概念,每个queue都绑定到它,arouting key等于它的queue name.

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

此外,在 RabbitTemplate 上,该queue属性仅用于接收(消费)消息,与发送消息无关;正如我所说,生产者不知道队列。

您应该使用以下...

<bean id="amqpTemplate" parent="rabbitTemplate">
    <property name="routing-key" value="${queue.name}" />
</bean>
于 2012-12-26T15:30:55.000 回答