使用JScript查看MSMQ传出队列

时间:2010-08-09 14:18:04

标签: queue msmq peek

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

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所在的机器上运行,但它不是唯一具有这些队列的机器。我想避免在任何地方部署脚本,我宁愿把它放在一个地方。感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

  • 传出队列不是真正的队列,但可以看作是“按照他们预定的队列分组的消息列表”。因此,无法远程监控它们。这意味着,要监视它们,必须在每台计算机上部署执行它的脚本/应用程序,并且在群集环境中,必须在每个群集组中运行实例。如果有许多服务器,这会增加很大的开销,但可以通过创建集中式系统来克服。无论如何都要承担大任务......

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