2013-04-23 47 views
0

我正在研究一個項目,我們有一個高吞吐量的jms消息生產(也是消費者,順便說一下)。 一些測試讓我相信我不能正確地使用JMS消息生產。 首先讓我解釋一下場景: 我們有一個13個隊列的Weblogic集羣(2個節點)。這些消息在UDP監聽器(Netty)上接收,並創建一個ByteMessage,並將其分配到第一個隊列中,依此類推。 隨着一些分析我發現,這第一步並不需要很長的時間執行,它的消費者都沒有消息,但消息仍然長時間停留在隊列中。 它們是非持久性的,交付時間爲0(零)。 一個改進是緩存de connectionFactory,ConnectionQueue,Queue和QueueSession並像永遠一樣使用它們。但是這不可能是正確的。我的意思是,我們不應該開放這些資源,永遠不要關閉它們,對吧?什麼應該被緩存,什麼時候應該釋放一個連接和一個會話?我應該爲每封郵件創建會話以發送還是可以重用? 我的意思是,考慮到正確的資源處理,在Queue上生成大量jms消息(每秒300次左右)的最佳方式是什麼? 我被困在這裏,我找到的所有資源都告訴我在工作完成時總是關閉,但從未完成(它總是會收到大量的消息)。Weblogic JMS高吞吐量生產者/消費者

提前問候。

編輯:我忘了說MDB的默認消費者大小爲16,理論上考慮單個消息所需的處理時間應足以消耗所有消息而不需要「儲存」它們。

回答

2

您需要緩存JMS對象。

如果您使用的是Java EE服務器,那麼它應該爲您執行此操作。我相信這是可配置的。

https://community.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions

JMS像連接,會話,消費者和生產者的對象被 設計成可重複使用。在大多數實現中,連接和會話 的設置相當重量級,而且消費者通常需要設置網絡往返的 。生產者通常更輕, ,雖然在創建它往往有一些開銷。

Spring還提供連接和會話緩存包裝。

調整WebLogic JMS http://docs.oracle.com/cd/E28280_01/web.1111/e13814/jmstuning.htm

+0

我喜歡簡單地注入這些對象。 但它是客戶禁止使用DI的遺留系統。我不知道爲什麼。 因此,使用EJB和MDB是可以的,但我需要查找所有內容才能使事情順利進行。 我仍然應該緩存我引用的所有這些對象類型嗎?謝謝! – Marcelo 2013-04-23 12:49:46

+0

我還在做一些測試,但看起來你的消息來源幫了我很多! – Marcelo 2013-04-23 14:17:32

+0

我寫了一個答案,它似乎消失在某處..從JNDI獲取對象大部分與DI相同。 Java EE服務器(和WebLogic Server)也在適當的情況下爲JNDI中的JMS對象提供對象緩存。正如你所提到的,關於在文檔中微調基礎結構有很多有用的信息。很高興它幫助! – Vitaly 2013-04-23 14:36:25