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

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 队列,而脚本在当前控制台会话下运行。要访问集群资源组内的队列,必须执行以下操作:

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

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

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

我希望我的发现对未来的人有用。:)回到披萨烘烤...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top