2008-12-23 109 views
0

我們構建了基於ActiveMQ的應用程序基礎架構。ActiveMQ消息收據事件每秒只有一條消息?

我們可以很好地發送和接收消息,並且大部分情況下都非常快速和可靠。

但是,我們已經注意到,如果我們一次提交一批消息,比如說5,000條消息,那麼ActiveMQ會很快將消息傳遞給另一端的第三方應用程序,並且此應用程序將過程也非常迅速,而且它也會迅速將答覆排回經紀人,也就是不到一分鐘。

但是由於某種原因,我們的VB.NET EXE只是首先發送消息,它似乎是在處理返回的消息,它接收不規則的消息,有時每秒鐘處理大約一次,有時會休息一個小時左右,然後回到每秒一個。

Origin (VB.NET EXE which we manage) 
    -> Broker (which we manage) 
     -> (3rd party app) 
      -> back to the same broker 
       -> back to the origin app. 

接收器正在等待從C#代碼的事件消息監聽從ActiveMQ的,也許10個月前下載:

Public Delegate Sub MessageListener(ByVal message As NMS.IMessage) 
    Member of: NMS 

我認爲發生的事情是,消息監聽只給我們一個消息(NMS.IMessage)咀嚼,所以這就是我們所處理的。

有沒有什麼方法可以說:「在MessageListener事件上,請查看隊列上是否有其他消息,並執行它們」?

回答

1

一起轉動我們認爲我們現在知道更多這是關於什麼。

當我們的VB.NET WinForms應用程序使用ActiveMQ DLL最終崩潰時,它每週會做幾次,我們有一個看門狗程序,它使用Winternals pslist和pskill實用程序來收割殭屍,然後開始一個新的客戶端連接。

發生這種情況時,使用jconsole來分析代理向我們顯示殭屍會話仍然被註冊,新客戶端也是如此。

我現在的理論是,當AMQ看到兩個會話時,它都會嘗試開始將消息分配給兩種會話循環模式。 AMQ嘗試將消息發送給殭屍,殭屍不響應。經過一段時間(可能是一秒),AMQ放棄並進入列表中的下一個會話,即新的新客戶端。

在某些情況下,代理或TCP協議棧可能會注意到殭屍並未保持其TCP連接處於活動狀態並放棄;然後操作恢復正常。

所以問題是,如何編寫一個ActiveMQ客戶端,a)不死或b)優雅地死掉,關閉它的過程中的會話?

編輯:升級到下一個版本的ActiveMQ解決了這個問題。此外,我們有一個應用程序執行發送和接收,但它不是線程安全的 - 因此,如果它在嘗試發送時收到,則會導致崩潰。我們將它重新編寫爲兩個控制檯應用程序,一個發送數據和一個接收數據。沒有更多的崩潰。此外,我們當時使用的舊版ActiveMQ沒有妥善處理崩潰,升級到4.x解決了這個問題。

0

我建議這個報告對User Forum有可能提高一個support issue,因爲這聽起來像它可能是一些問題與NMS客戶端代碼和所有的NMS開發者都在此列,並可能做出反應