消息隊列本來就是一種經典的生産者與消費者模式。生産者向消息隊列中發送消息,消費者從消息隊列中擷取消息來消費。
消息的傳送一般由一個代理來實作的,那就是Message broker(即消息代理)。Message broker有兩大職責,一是消息路由,二是資料轉換。這就好比A給B寄信,如果不使用郵局的話,就要自己想辦法送達,費時費力,而通過郵局的話,隻要B的位址在郵局中注冊過,那麼天涯海角也能送達。這裡的郵局扮演的角色就像消息系統中的Message broker。
衆所周知,消息隊列是典型的’send and forget’原則的展現,生産者隻管發送,不管消息的後續處理。為了最大效率的完成對消息隊列中的消息的消費,一般可以同時起多個一模一樣的消費者,以并行的方式來拉取消息隊列中的消息。這樣的好處有多個:
加快處理消息隊列中的消息。
增強穩定性,如果一個消費者出現問題,不會影響對消息隊列中消息的處理。
使用Spring JMS來配置多個Listener執行個體其實也相當簡單,隻需要配置下MessageListenerContainer就行。
多配置一個屬性<code>concurrentConsumers</code>,設定值為4,就是同時啟動4個Listener執行個體來消費消息。
使用MessageSender來發送100條消息,可以檢查消息處理的順序會發生變化。
除了設定一個固定的Listener數量,也可以設定一個Listener區間,這樣MessageListenerContainer可以根據消息隊列中的消息規模自動調整并行數量。
這次使用的是<code>concurrency</code>屬性,4-8表示最小并發數是4,最大并發數為8,當然也可以給一個固定值,比如5,這樣就相當于concurrentConsumers屬性了。