消息隊列本來就是一種經(jīng)典的生產(chǎn)者與消費者模式。生產(chǎn)者向消息隊列中發(fā)送消息,消費者從消息隊列中獲取消息來消費。

消息的傳送一般由一個代理來實現(xiàn)的,那就是Message broker(即消息代理)。Message broker有兩大職責(zé),一是消息路由,二是數(shù)據(jù)轉(zhuǎn)換。這就好比A給B寄信,如果不使用郵局的話,就要自己想辦法送達(dá),費時費力,而通過郵局的話,只要B的地址在郵局中注冊過,那么天涯海角也能送達(dá)。這里的郵局扮演的角色就像消息系統(tǒng)中的Message broker。

眾所周知,消息隊列是典型的’send and forget’原則的體現(xiàn),生產(chǎn)者只管發(fā)送,不管消息的后續(xù)處理。為了最大效率的完成對消息隊列中的消息的消費,一般可以同時起多個一模一樣的消費者,以并行的方式來拉取消息隊列中的消息。這樣的好處有多個:
加快處理消息隊列中的消息。
增強穩(wěn)定性,如果一個消費者出現(xiàn)問題,不會影響對消息隊列中消息的處理。

使用Spring JMS來配置多個Listener實例其實也相當(dāng)簡單,只需要配置下MessageListenerContainer就行。
123456 |
|
多配置一個屬性concurrentConsumers
,設(shè)置值為4,就是同時啟動4個Listener實例來消費消息。
使用MessageSender來發(fā)送100條消息,可以檢查消息處理的順序會發(fā)生變化。
123 |
|
123456789 |
|
除了設(shè)置一個固定的Listener數(shù)量,也可以設(shè)置一個Listener區(qū)間,這樣MessageListenerContainer可以根據(jù)消息隊列中的消息規(guī)模自動調(diào)整并行數(shù)量。
123456 |
|
這次使用的是concurrency
屬性,4-8表示最小并發(fā)數(shù)是4,最大并發(fā)數(shù)為8,當(dāng)然也可以給一個固定值,比如5,這樣就相當(dāng)于concurrentConsumers屬性了。
本章中的完整源碼可從完整代碼可從https://github.com/huangbowen521/SpringJMSSample下載。