2013-10-24 171 views
19

我們在Tomcat(7.0.41)中使用Spring(3.2.4)和ActiveMQ(5.8.0),並且不清楚最佳用法。我們想要使用JmsTemplate來生成MessageListenerContainer來接收消息。

我們應該在接收端使用緩存嗎? (related link
使用ActiveMQ和故障轉移工作CachingConnectionFactory? (related link
當我們使用PooledConnectionFactory時,需要設置useAsyncSend =「true」嗎? (related link
哪個更好:PooledConnectionFactory或CachingConnectionFactory?

+0

我已經用於製造消息(JmsTemplate的)和消費(使用DefaultMessageListenerContainer)CachingConnectionFactory遠遠超過了一年與Spring(3.0.7)的ActiveMQ(5.5.0)和Tomcat和沒有經歷過任何問題。通常,我的消費者處理來自queue_1的消息,並通過將消息發佈到queue_2來完成,但隊列交互使用相同的CachingConnectionFactory。 – shuttsy

回答

30

here來自:

的PooledConnectionFactory和CachingConnectionFactory之間的差別是在執行的差。下面是一些他們之間不同的特點:

  • 雖然兩者的PooledConnectionFactory和CachingConnectionFactory狀態,他們每個池連接,會話和生產者的PooledConnectionFactory實際上並沒有建立多個生產商的緩存。它只需使用單例模式在請求一個緩存的生產者時發出。而CachingConnectionFactory實際上創建一個包含多個生產者的緩存,並在請求時從緩存中提取一個生產者。

  • PooledConnectionFactory構建在用於池化JMS會話的Apache Commons Pool項目之上。這允許對池進行一些額外的控制,因爲Commons Pool中有PooledConnectionFactory未使用的功能。這些附加功能包括增加池大小而不是阻塞,當池耗盡時拋出異常等。您可以通過使用您自己的自定義設置創建自己的Commons Pool GenericObjectPool,然後將該對象移交給PooledConnectionFactory,以通過setPoolFactory方法。有關其他信息,請參見以下內容:http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPoolFactory.html

  • CachingConnectionFactory還可以緩存使用者。使用此功能時需要小心,以便根據博客文章中提到的規則知道消費者已被緩存。

  • 但最重要的是,CachingConnectionFactory將與任何符合JMS的MOM協同工作。它只需要一個JMS連接工廠。如果您使用多個MOM供應商(這在企業組織中非常普遍)(這主要是由於遺留和現有項目),這一點非常重要。重要的一點是CachingConnectionFactory與許多不同的MOM實現很好地協作,不僅是ActiveMQ。

here

  • 如果你已經聚集ActiveMQs,並使用故障轉移運輸已經報道CachingConnectionFactory是不是一個正確的選擇。

  • 我遇到的問題是,如果一個箱出現故障,我們應該開始 在其他發送消息,但它似乎仍然使用舊 連接(每一個發送超時)。如果我重新啓動程序,它會再次連接並且一切正常。來源: Autoreconnect problem with ActiveMQ and CachingConnectionFactory

  • 的問題是要失敗的ActiveMQ緩存的連接是 仍在使用和產生問題的用戶。現在,此場景的 選項是PooledConnectionFactory。

  • 如果您使用的ActiveMQ的今天,有機會,你可以切換到在未來的一些其他代理(JBoss的MQ,WebSphere MQ的),不要使用 PooledConnectionFactory,因爲它緊緊地將你的代碼,以 ActiveMQ的。

+0

這是一個很好的兩個工廠的總體描述,但我會添加一些評論: 我們應該在接收端使用緩存? 我在ActiveMQ in Action書中發現,這不是必需的。 使用ActiveMQ和故障轉移工作CachingConnectionFactory? 「Autoreconnect問題...」包含的鏈接是2個相反的答案,但似乎PooledConnectionFactory肯定會起作用,所以我們將使用它(我們不打算使用另一個MOM)。 當我們使用PooledConnectionFactory時,需要設置useAsyncSend =「true」嗎? 我們仍然不知道,但它不應該是一個問題,如果它被設置。 :) – Krayo

+0

異步發送:告訴生產者不要阻止等待確認 發送的每個消息:http://activemq.apache.org/async-sends.html(我認爲它不應該是一個問題) – united

+0

我認爲最好在不同的問題中提出新的問題;) – united