我們在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?
回答
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的。
這是一個很好的兩個工廠的總體描述,但我會添加一些評論: 我們應該在接收端使用緩存? 我在ActiveMQ in Action書中發現,這不是必需的。 使用ActiveMQ和故障轉移工作CachingConnectionFactory? 「Autoreconnect問題...」包含的鏈接是2個相反的答案,但似乎PooledConnectionFactory肯定會起作用,所以我們將使用它(我們不打算使用另一個MOM)。 當我們使用PooledConnectionFactory時,需要設置useAsyncSend =「true」嗎? 我們仍然不知道,但它不應該是一個問題,如果它被設置。 :) – Krayo
異步發送:告訴生產者不要阻止等待確認 發送的每個消息:http://activemq.apache.org/async-sends.html(我認爲它不應該是一個問題) – united
我認爲最好在不同的問題中提出新的問題;) – united
- 1. min或gzip,哪個更好?
- 2. 哪個更好? OpenCyc或ConceptNet?
- 3. 哪個更好,Nagios或Sensu?
- 4. jqGrid或dataTable,哪個更好?
- 5. PHP:ParseCSV或PHPExcel哪個更好?
- 6. DataTable或IList?哪個更好?
- 7. 哪個更好? city.state.id或city.state_id
- 8. PigServer或PigRunner?哪個更好?
- 9. 哪個更好H2或HSQLDB?
- 10. 哪個更好Paperclip或CarrierWave?
- 11. 哪個更好Math.random()或UIDUtil.createUID()
- 12. 哪個更好BOOST_MPL_ASSERT或BOOST_STATIC_ASSERT?
- 13. Magento或Prestashop,哪個更好?
- 14. Gzip或ob_flush()?哪個更好?
- 15. Japid或Scala哪個更好?
- 16. 哪個更好c89或c99
- 17. Coredata或Sqlite哪個更好
- 18. 哪個更好... GATE或RapidMiner
- 19. 哪個更好 - PyInstaller或cx_Freeze?
- 20. 哪個更好:Parcelable或Context?
- 21. RTC或AccuRev哪個更好?
- 22. Vector.contains()或Hashtable.get()哪個更好
- 23. Android:ViewFlipper或ViewPager - 哪個更好?
- 24. 哪個更好,setEnabled或setUserInteractionEnabled?
- 25. 哪個更好或者Viewgroup或者Layout
- 26. SocketChannel:單個或多個,哪個更好?
- 27. 哪個更好
- 28. 哪個更好?
- 29. 哪個更好?
- 30. 哪個更快/更好:哪裏更新或合併?
我已經用於製造消息(JmsTemplate的)和消費(使用DefaultMessageListenerContainer)CachingConnectionFactory遠遠超過了一年與Spring(3.0.7)的ActiveMQ(5.5.0)和Tomcat和沒有經歷過任何問題。通常,我的消費者處理來自queue_1的消息,並通過將消息發佈到queue_2來完成,但隊列交互使用相同的CachingConnectionFactory。 – shuttsy