ActiveMQ:設置多個並行的消費者

消息隊列本來就是一種經典的生產者與消費者模式。生產者向消息隊列中發送消息,消費者從消息隊列中獲取消息來消費。

 

 

消息的傳送一般由一個代理來實現的,那就是Message broker(即消息代理)。Message broker有兩大職責,一是消息路由,二是數據轉換。這就好比A給B寄信,如果不使用郵局的話,就要自己想辦法送達,費時費力,而通過郵局的話,只要B的地址在郵局中註冊過,那麼天涯海角也能送達。這裏的郵局扮演的角色就像消息系統中的Message broker。

 

衆所周知,消息隊列是典型的’send and forget’原則的體現,生產者只管發送,不管消息的後續處理。爲了最大效率的完成對消息隊列中的消息的消費,一般可以同時起多個一模一樣的消費者,以並行的方式來拉取消息隊列中的消息。這樣的好處有多個:

  1. 加快處理消息隊列中的消息。

  2. 增強穩定性,如果一個消費者出現問題,不會影響對消息隊列中消息的處理。

 

使用Spring JMS來配置多個Listener實例其實也相當簡單,只需要配置下MessageListenerContainer就行。

 

 

1
2
3
4
5
6

 
  1. <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">

  2. <property name="connectionFactory" ref="connectionFactory"/>

  3. <property name="destinationName" value="${jms.queue.name}"/>

  4. <property name="messageListener" ref="messageReceiver"/>

  5. <property name="concurrentConsumers" value="4"/>

  6. </bean>

  7.  

 

多配置一個屬性concurrentConsumers,設置值爲4,就是同時啓動4個Listener實例來消費消息。

使用MessageSender來發送100條消息,可以檢查消息處理的順序會發生變化。

 

 

1
2
3

 
  1. for (int i = 0; i < 100; i++) {

  2. messageSender.send(String.format("message %d",i));

  3. }

  4.  

 

 

1
2
3
4
5
6
7
8
9

 
  1. ...

  2. Received: message 4

  3. Received: message 7

  4. Received: message 6

  5. Received: message 5

  6. Received: message 8

  7. Received: message 10

  8. Received: message 9

  9.  

 

除了設置一個固定的Listener數量,也可以設置一個Listener區間,這樣MessageListenerContainer可以根據消息隊列中的消息規模自動調整並行數量。

 

 

1
2
3
4
5
6

 
  1. <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">

  2. <property name="connectionFactory" ref="connectionFactory"/>

  3. <property name="destinationName" value="${jms.queue.name}"/>

  4. <property name="messageListener" ref="messageReceiver"/>

  5. <property name="concurrency" value="4-8"/>

  6. </bean>

  7.  

 

這次使用的是concurrency屬性,4-8表示最小併發數是4,最大併發數爲8,當然也可以給一個固定值,比如5,這樣就相當於concurrentConsumers屬性了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章