0

我创建了一个脚本来监控一组队列,虽然它与远程专用队列完美配合,但它不适用于传出队列。我做了一个实验,从脚本中删除了除基本内容之外的所有内容,并创建了以下测试脚本:

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();

然后我在服务器上运行它,即使队列包含超过一千条消息,PeekCurrent也总是返回 null。如果我删除 MQ_ADMIN_ACCESS,它会尝试连接到远程专用队列并且它会超时(正如预期的那样,因为它已经让消息累积)。如果我然后启动远程专用队列,它会从中正确读取消息。

出于好奇,我发现使用MQ_ADMIN_ACCESS 时,无论队列名称(即是否存在) , info.Open总是成功。例如,我输入“DIRECT=OS:Whatever\private$\RandomQueueName”,我没有收到任何错误。

我不是 MSMQ 的专家(恰恰相反),所以我可能犯了一个明显的错误,我看不到它。任何帮助都非常受欢迎。谢谢。

附带问题:是否可以查看远程传出队列?目前脚本正在我正在测试的 Outgoing Queue 所在的机器上运行,但它并不是唯一具有这些队列的机器。我想避免在任何地方部署脚本,我更愿意将它放在一个地方。谢谢。

4

1 回答 1

0

我找到了两个问题的答案:

  • 我遇到的问题是由于我试图监视作为群集资源组的一部分运行的 MSMQ 队列,而脚本在当前控制台会话下运行。要访问集群资源组中的队列,必须执行以下操作:

    1. 创建一个新的通用应用程序
    2. 运行 MSMQ 服务的组内的资源,并将其指向您的脚本。
    3. 在新资源的配置中,将 MSMQ 服务添加为依赖项。
    4. 确保选中“使用网络名称作为计算机名称”复选框

完成后,您的脚本现在将连接到集群组内运行的 MSMQ 服务。

  • Outgoing Queue 不是真正的 Queue,但可以看作是“消息列表,按它们注定要到达的 Queue 分组”。因此,它们无法被远程监控。这意味着,要监控它们,必须在每台机器上部署执行它的脚本/应用程序,并且在集群环境中,必须在每个集群组中运行一个实例。如果有许多服务器,这会增加大量开销,但可以通过创建集中式系统来克服。总之任务大...

我希望我的发现对将来的某些人有用。:) 回到比萨烘焙...

于 2011-02-14T22:26:45.127 回答