2010-08-09 65 views
0

我創建了一個腳本來監視一組隊列,並且儘管它與遠程專用隊列完美協作,但它不適用於傳出隊列。我從腳本中刪除一切,但基本做了一個實驗,我創建了下面的測試腳本:使用JScript查看MSMQ傳出隊列

var info = new ActiveXObject("MSMQ.MSMQQueueInfo"); 
info.FormatName = /*<Queue name>*/; 

// 0x80 = MQ_ADMIN_ACCESS 
// 0x20 = MQ_PEEK_ACCESS 
// 0x00 = MQ_DENY NONE 
var mq = info.Open(0x80 | 0x20, 0x00); 

var msg = mq.PeekCurrent(false, true, 0); 
if (msg != null) { 
    WScript.echo("message found"); 
} 
else 
{ 
    WScript.echo("Nothing"); 
} 
mq.close(); 

然後我跑在服務器上,而且即使隊列包含超過1000封,PeekCurrent總是返回null。如果我刪除MQ_ADMIN_ACCESS,它會嘗試連接到遠程專用隊列,並且超時(如預期的那樣,因爲它會讓消息累積)。如果我然後啓動遠程專用隊列,它會從中正確讀取消息。

出於好奇,我發現info.Open無論使用MQ_ADMIN_ACCESS時的隊列名稱(即是否存在)都會成功。例如,我輸入「DIRECT = OS:無論\私人$ \ RandomQueueName」,我沒有得到任何錯誤。

我不是MSMQ的專家(完全相反),所以我可能犯了一個明顯的錯誤,我看不到它。任何幫助都比歡迎。謝謝。

旁邊的問題:是否有可能偷看遠程傳出隊列?目前腳本運行在正在測試的傳出隊列所在的機器上,但它不是唯一具有這些隊列的人。我想避免在任何地方部署腳本,我寧願將它放在一個地方。謝謝。

回答

0

我找到了答案,我的兩個問題:

  • 我有是由於這樣的事實,我想監視其運行爲羣集資源組的一部分的MSMQ隊列的問題,而該腳本在當前的控制檯會話下運行。要訪問隊列羣集資源組裏面,下面必須做到:

    1. 創建一個新的通用應用程序
    2. 資源集團內部,其中MSMQ服務正在運行,並將其指向你的腳本。
    3. 在配置新資源中,添加MSMQ服務作爲依賴關係。
    4. 確保複選框「使用網絡名稱作爲計算機名稱」爲已選中

做,你的腳本現在將連接到MSMQ服務羣集組中運行。

  • 傳出隊列不是真正的隊列,但可以看作是「消息列表,按它們註定的隊列分組」。因此,他們不能被遠程監控。這意味着要監視它們,必須在每臺機器上部署它的腳本/應用程序,並且在羣集環境中,實例必須在每個羣集組中運行。如果有很多服務器,這會增加很大的開銷,但是可以通過創建一個集中式系統來克服。大任務無論如何...

我希望我的發現將有用的人在未來。 :) 回烤披薩...