2012-01-18 57 views
1

我在查詢遠程msmq隊列的消息數時遇到了問題。用ruby讀取MSMQ消息數

這是我的代碼:

def get_message_count 
    mq_management = WIN32OLE.new('MSMQ.MSMQManagement') 
    mq_management.Init('xxx.yyy.zz.aa', nil,'direct=tcp:xxx.yyy.zz.aa\private$\inbox') 
    message_count = mq_management.MessageCount 
end 

xxx.yyy.zz.aa是遠程計算機的IP地址。

這種方法實際上可以作爲一個魅力,但:

  1. 如果隊列爲空,然後我不斷收到一定的時間後此錯誤:

    '的method_missing':初始化(WIN32OLERuntimeError ) OLE錯誤代碼:MSMQManagement中的C00E0004 隊列未打開或可能不存在。 HRESULT錯誤代碼:0x80020009 發生異常。

  2. 如果隊列中還有項目,那麼這個方法就像它應該的那樣工作。

我發現這篇文章:How do I create an MSMQ outgoing queue? 它說:

MSMQ保持以防萬一你要發送另一個消息隊列活着(即使是空的)幾分鐘。這節省了隊列管理器再次進行網絡連接的努力。此清理延遲由CleanupInterval註冊表值控制 - 客戶端爲5分鐘,服務器爲2分鐘。

它目前不是我們調整註冊表設置的選項。 另一種選擇可能是嘗試通過WMI獲取消息數量,但我不確定你是如何在ruby中做到的(作爲.NET開發人員)。

也許有可能「喚醒」隊列?

我將不勝感激任何幫助! 謝謝

回答

1

爲了提高效率,MSMQ不維護隊列是性能數據:

  1. 空,並
  2. 關閉

你可以,例如,有一臺機器如果這些數據被主動維護,那麼將有1000個空隊列將鎖定內存資源。實際上,在應用程序打開之前,空隊列不會作爲要分析的事物存在。

由於您正在查詢有關專用隊列的信息,因此有關傳出隊列的博文與此情況無關。

乾杯 John Breakwell

+1

嗨,John,謝謝你的回答。 現在我很清楚這個消息隊列消耗很多資源的問題。 但是這部分: 「實際上,空隊列不會作爲要分析的東西存在,直到它們被應用程序打開爲止。」存在一些問題。查詢「不活動」消息隊列會導致與服務器無法訪問時相同的異常。所以很難說出原因是什麼。如果空隊列「實際上不存在」,則不應該可以分析此隊列的性能計數器。這真的不可能嗎? – Helikaon 2012-01-18 20:51:34

+0

簡單測試:加載性能監視器並嘗試添加「隊列中的MSMQ隊列\消息」對象的實例。您可以選擇的隊列列表將不包括空閒/非活動隊列。 – 2012-01-18 22:35:32

+0

解決方法之一是在接收應用程序從不讀取的每個隊列中放入一條消息。此「keepalive」消息確保隊列顯示用於性能監視。顯然不適用於自動從隊列頂部接收消息的應用程序。 – 2012-01-18 22:37:37