【问题标题】:Peeking an MSMQ Outgoing Queue with JScript使用 JScript 查看 MSMQ 传出队列
【发布时间】:2010-08-09 14:18:03
【问题描述】:

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

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

【问题讨论】:

    标签: queue msmq peek


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2018-02-20
      • 2013-07-01
      • 2011-05-01
      • 1970-01-01
      • 2011-06-02
      • 2011-09-05
      • 2011-04-21
      相关资源
      最近更新 更多