2015-04-07 93 views
1

春季兔子可以在單一主題上支持多個併發消費者嗎?春季兔子的每個主題的併發消費者

下面是詳細信息

我的系統使用手冊ACK模式通過彈簧的兔子的話題交換(春季4.0.6)。所述圖案如下:

  • 消息進入ChannelAwareMessageListener
  • 工廠方法產生一個適當的工人,並傳遞到信道
  • 如果工人成功處理該消息的引用,該消息是確認」 d
  • 如果工人是不成功或異常情況發生時,該消息是Nack'd和送入死信隊列用於以後的處理

由於其中的一些工作人員可以花費相當多的時間來完成他們的IO綁定處理,我需要能夠設置更多的併發用戶。

但經過一番測試後,我發現有時候有幾個消費者收到同樣的消息。果然,一看文檔(http://docs.spring.io/spring-framework/docs/4.0.6.RELEASE/javadoc-api/org/springframework/jms/listener/DefaultMessageListenerContainer.html#setConcurrentConsumers-int-),印證了我的發現:

不要提高併發用戶的數量的話題,除非供應商特定的設置措施明確允許它。通過定期設置,這將導致同時消費同一消息,這幾乎不可取。

我的問題如下:

  1. 這到底是什麼「除非供應商特定的設置措施明確允許它」是什麼意思?有補丁/版本/配置還是支持這個的兔子?
  2. 我可以很容易地在客戶端編寫代碼,防止消息被其他工作人員處理時處理消息。那麼,我該怎麼處理這個信息呢?發送nack?忽略它?如果我nack,然後實際處理消息的工作人員在一段時間之後發送ack會發生什麼情況?會拋出異常嗎?

在此先感謝...

回答

1

你mentionned的警告是關於JMS不RabbitMQ的。看看Spring RabbitMQ documentation。該文檔不包含此警告。

一旦消息傳遞到隊列(無論交換類型如何),它可以由消費者/工作人員一次只有一次(假設沒有問題)。

如果收到同一消息兩次是在某個地方的問題:

  • 消息被NACKED和重新排隊
  • 通道/連接的客戶端上的封閉
  • 存在網絡問題,兔子自動將消息(服務器和客戶端上的通道/連接關閉)

對於最後兩點,您應該得到一些錯誤消息年齡。

注意這一點是在我看來不必要的,並且可以解釋該問題:

  • 工廠方法產生一個適當的工人和通過在一個 參考信道

SimpleMessageListenerContainer已經使用Executor。由於您使用自己的執行程序,因此spring-amqp渠道池(如果使用任何)和您的執行程序之間可能存在問題。該通道已關閉,因爲spring-amqp認爲它不再使用。

不是產生自己的線程,而是在當前線程的同一線程上處理消息。

相關問題