2015-07-03 10 views
1

我對SimpleMessageListenerContainer handleMesage的工作原理有疑問嗎?我的問題的情況是,我有1000個消息(M1,M2 ... M100)的隊列,然後開始消費(5個併發用戶)和acknowledgeMode =在這種情況下 'NONE',SimpleMessageListenerContainer handleMesage()如何工作?

  1. 不handleMesage消耗5個消息(m1,m2,m3,m4,m5),然後是下一個5條消息,等等......?

  2. 容器是否創建5個Receiver實例?

  3. 想知道句柄消息的結束位置嗎?

能否請你讓我知道這些..因爲我們能不能夠儘快看到這些消息的消費者在RMQ MNGMT控制檯啓動....我們handleMesage方法中的代碼將採取ATLEAST幾秒鐘到處理每個請求。

<bean id="sampleListenerContainer" 
     class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <property name="queueNames"> 
      <array> 
       <value>TEST_QUEUE</value> 
      </array> 
     </property> 
     <property name="messageListener" ref="messageListenerAdaptor" /> 
     <property name="acknowledgeMode" value="NONE" /> 
     <property name="concurrentConsumers" value="5" /> 
    </bean> 

    <!-- message listener --> 
    <bean id="messageListenerAdaptor" 
     class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter"> 
     <property name="delegate" ref="listenerPojo" /> 
     <property name="messageConverter" ref="messageConverter" /> 
    </bean> 

    <bean id="listenerPojo" 
     class="com.amqp.consumer.Receiver" > 
    </bean> 

回答

1
  1. 隨着1.3版本及更高版本,每個消費者同時得到預取消息(經紀人給他們循環賽)

  2. 是的,但他們是所謂的消費者,而不是接收器

  3. 當偵聽器方法退出時,消費者抓取下一條消息,這釋放了amqp-client線程,以便它可以從代理獲取另一條消息。

ackmode NONE取決於您使用的是哪個版本的Spring AMQP如何將消息傳遞給消費者。

使用1.3之前的版本,所有1000條消息將立即發送到容器(每個消費者200個)。

在版本1.3.0之後,發送給每個消費者的消息數量取決於prefetchCount屬性(默認值爲1);實際上會爲每個消費者從代理中刪除prefetch+1消息。

瞭解AcknowledgeMode="NONE"意味着您可能會丟失消息,因爲代理在將消息發送給使用者時會自動收到消息。如果服務器崩潰,任何坐在消費者中的消息(預取)都將丟失。

相關問題