我不明白。 我正在使用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吗?
答案 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>