我创建了一个脚本来监视一组队列,虽然它与远程专用队列完美配合,但它不适用于传出队列。我做了一个实验,除了脚本中的必要内容之外,我创建了以下测试脚本:
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所在的机器上运行,但它不是唯一具有这些队列的机器。我想避免在任何地方部署脚本,我宁愿把它放在一个地方。感谢。
答案 0 :(得分:0)
我找到了两个问题的答案:
我遇到的问题是由于我尝试监视作为群集资源组的一部分运行的MSMQ队列,而脚本在当前的控制台会话下运行。要访问群集资源组内的队列,必须执行以下操作:
完成后,您的脚本现在将连接到群集组内运行的MSMQ服务。
我希望我的发现将来会对某些人有用。 :) 回到披萨烘焙......