2012-12-26 25 views
1

我不明白的東西。 我使用Spring集成從RabbitMQ的發送和接收消息。直接交換不使用默認工作routingKey

我的拓撲結構是非常簡單的:

  • 一個使用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消耗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> 

然後我還可以將消息發送到隊列,但他們永遠不會再消耗! 有人可以解釋我是怎麼回事? 我不能從一個JVM將消息發送到另一個沒有routingKey?

回答

3

...但根據文件,我不認爲routingKey是強制性...

其中「文檔」你指的是?

隨着AMQP,生產者不知道隊列;他們將消息發送到具有綁定路由到隊列的各種類型的交換機。

也許您錯誤理解了默認交易所的概念,每個queue都與其綁定,routing key等於queue name

這使得簡單的路由到特定的隊列(他們的名字的方式)。默認的交換是一個方便的提供一個快速入門amqp消息。這可以正常工作,但是您可能需要考慮使用顯式聲明的繁文,因爲它將生產者與消費者進一步分離。通過默認交換,生產者必須知道消費者正在監聽的隊列的名稱。

此外,在RabbitTemplate,所述queue屬性僅用於接收(消耗)消息,它具有對發送消息沒有軸承;正如我所說的,製片人不知道隊列。

您應該使用以下...

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

感謝,我現在明白了:) –