2015-09-11 27 views
2

消息是否有與asyncSend設置爲true發送持久性消息最佳實踐或指導。發送大量使用春天JmsTemplate的

我們沒有事務管理器配置

我們有正在使用JmsTemplate的發送配置了

org.apache.activemq.pool.PooledConnectionFactory 

〜40K-50K的消息我們已經for循環它迭代消息列表,並將它們發送使用

jmsTemplate.convertAndSend(destination, msg) 

我們看到很多頻繁的基礎上消息丟失的,當我們關閉asyncSend我們得到的可靠性,但在p roducer性能95%

+0

它是相同的,當你使用它在本地主機上?我會嘗試與其他JMS提供商一起測試以縮小通信的哪個方面存在問題(如果它不是一些較低級別的問題:例如傳輸層)。 – luboskrnac

+0

@Ikrnac沒有生產者Java客戶端,activemq代理坐落在不同的物理盒子上。這可能是一個傳輸層問題,我同意,我看到有什麼最好的方式,以良好的可靠性與體面的表現 – blob

+0

我建議一些調查方法。爲了證明它不是傳輸層,找到它們在同一臺機器上。如果它不是傳輸層,則更改JMS提供程序(例如HornetQ易於使用)以查明Spring或ActiveMQ是否導致問題。 – luboskrnac

回答

1

下降的炒作有點作爲的問題不是很詳細,但無論如何。

根據配置,ActiveMQ的可能對隊列內存限制(可能持久性和非持久性消息之間以及不同)。因此,當內存用完時,您的電話將忽略警告並繼續將消息傳遞到「黑洞」,直到消費者釋放內存爲止。

沒有銀彈,允許最大的性能和可靠性最高。不幸。

不過,我會嘗試連接工廠設置producerWindowSize,使數據的一些規定量接收到一個經紀人ACK之前。確切的價值是你需要嘗試的,取決於場景以及經紀人配置/資源。

+0

一旦我設置「producerWindowSize」,製作人會等待接收所有以前發送的消息的確認嗎? – blob

+1

ProducerWindowSize幫助我們,在峯值負載下幾乎沒有消息丟失。謝謝 – blob