题
我创建了一个脚本来监视一组队列,虽然它与远程专用队列完美配合,但它不适用于传出队列。我做了一个实验,从脚本中删除了除必要内容之外的所有内容,并创建了以下测试脚本:
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();
然后我在服务器上运行它,即使队列包含超过一千条消息, 峰值电流 总是返回 null。如果我删除 MQ_ADMIN_ACCESS,它会尝试连接到远程专用队列并超时(如预期,因为它会导致消息累积)。如果我随后启动远程专用队列,它会从中正确读取消息。
出于好奇,我发现 信息.打开 无论队列名称如何(即当使用 MQ_ADMIN_ACCESS 时(无论它是否存在)。例如,我输入“DIRECT=OS:Whatever\private$ andomQueueName”,但没有收到任何错误。
我不是 MSMQ 专家(恰恰相反),所以我可能犯了一个明显的错误,但我看不到它。非常欢迎任何帮助。谢谢。
附带问题:是否可以查看远程传出队列?目前,该脚本正在我正在测试的传出队列所在的计算机上运行,但它并不是唯一具有这些队列的计算机。我想避免在任何地方部署脚本,我宁愿将其放在一个地方。谢谢。
解决方案
我找到了我的两个问题的答案:
我遇到的问题是由于我尝试监视作为群集资源组的一部分运行的 MSMQ 队列,而脚本在当前控制台会话下运行。要访问集群资源组内的队列,必须执行以下操作:
- 创建一个新的通用应用程序
- 运行 MSMQ 服务的组内的资源,并将其指向您的脚本。
- 在新资源的配置中,添加 MSMQ 服务作为依赖项。
- 确保选中“使用网络名称作为计算机名称”复选框 检查过.
完成后,您的脚本现在将连接到在群集组内运行的 MSMQ 服务。
- 传出队列不是真正的队列,但可以看作“消息列表,按它们注定要到达的队列分组”。因此,无法对其进行远程监控。这意味着,要监视它们,必须将执行此操作的脚本/应用程序部署在每台计算机上,并且在集群环境中,每个集群组中必须运行一个实例。如果有很多服务器,这会增加显着的开销,但可以通过创建集中式系统来克服。无论如何,任务很大...
我希望我的发现对未来的人有用。:)回到披萨烘烤...
不隶属于 StackOverflow