2008-12-05 53 views
4

我一直在評估ActiveMQ作爲候選消息代理。我編寫了一些測試代碼來嘗試瞭解ActiveMQ的性能限制。這是分佈式機制的現實期望嗎?

我可以通過像這樣迅速地發送消息儘可能產生代理的故障狀態:

try { 
    while(true) { 
     byte[] payload = new byte[(int) (Math.random() * 16384)]; 
     BytesMessage message = session.createBytesMessage(); 
     message.writeBytes(payload); 
     producer.send(message); 
} catch (JMSException ex) { ... } 

我很驚訝的是,線

producer.send(message); 

塊時代理進入故障州。我希望能拋出一些例外,所以有跡象表明經紀人失敗了。

我意識到我的測試代碼是垃圾郵件的經紀人,我希望經紀人失敗。然而,我寧願代理人「大聲」失敗,而不是簡單地阻止。

這是不切實際的期望嗎?

更新:

烏里的回答引用在3月提出的ActiveMQ的錯誤報告。錯誤描述包括一個聽起來像我所尋找的提案:「如果對傳輸的請求有一個超時(這是爲了捕捉失敗的場景,所以不會有合理的事情發生),事情會發生錯誤比建立等待線程。「

但是,在8個月後,該bug目前還沒有分配到一票。所以我猜這個問題仍然存在,ActiveMQ應該(將?)實現這個問題嗎?

回答

0

對ActiveMQ配置不太確定,但其他JMS提供者有不同的配置選項 - 所以你可以在這種情況下讓ActiveMQ按照你的意願去做。

我知道Fiorano有選項來指定提供者是否在這種情況下阻塞。

+0

克里斯,感謝您的答覆。它看起來像我可以提高內存,但阻止是不可避免的:http://activemq.apache.org/my-producer-blocks.html – 2008-12-05 15:34:42

5

您正在測試所有消息代理必須處理的'slow consumer' and producer flowcontrol問題。你想失敗的生產者,阻止他們或後臺到磁盤?

基本上,在ActiveMQ中默認的開箱即用的是阻止生產者。但你可以configure message cursors to spool to disk

順便說一句,如果你使用隊列/主題或持久性/非持久性,你還沒有說過;如果您使用非持久性主題有,你可以使用丟棄消息等

+0

感謝您的響應,我使用的主題與非持久性消息。 我很好奇配置郵件遊標後臺到磁盤。如果我用這種配置來運行我的「垃圾郵件」測試程序,經紀人是否會開始填滿硬盤? – 2008-12-05 17:41:46