Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用ruby读取MSMQ消息计数_Ruby_Msmq_Windows Server - Fatal编程技术网

用ruby读取MSMQ消息计数

用ruby读取MSMQ消息计数,ruby,msmq,windows-server,Ruby,Msmq,Windows Server,从远程msmq队列查询消息计数时遇到问题 这是我的代码: def get_message_count mq_management = WIN32OLE.new('MSMQ.MSMQManagement') mq_management.Init('xxx.yyy.zz.aa', nil,'direct=tcp:xxx.yyy.zz.aa\private$\inbox') message_count = mq_management.MessageCount end xxx.

从远程msmq队列查询消息计数时遇到问题

这是我的代码:

def get_message_count
    mq_management = WIN32OLE.new('MSMQ.MSMQManagement')
    mq_management.Init('xxx.yyy.zz.aa', nil,'direct=tcp:xxx.yyy.zz.aa\private$\inbox')
    message_count = mq_management.MessageCount
end
xxx.yyy.zz.aa是远程计算机的IP地址

这种方法实际上是一种魅力,但是:

  • 如果队列为空,则经过一定时间后,我会不断收到此错误:

    `缺少方法“:Init(WIN32OLERuntimeError) MSMQManagement中的OLE错误代码:C00E0004 队列未打开或可能不存在。 HRESULT错误代码:0x80020009 发生异常

  • 如果队列中仍有项目,则此方法按其预期工作

  • 我发现这篇文章: 上面说:

    MSMQ使队列保持活动状态(即使它是空的)几分钟,以防您要发送另一条消息。这将节省队列管理器再次建立网络连接的工作量。此清理延迟由CleanupInterval注册表值控制-客户端为5分钟,服务器为2分钟

    目前,我们无法调整注册表设置。 另一个选择可能是尝试通过WMI获取消息计数,但我不确定您在ruby中是如何做到这一点的(作为一名.NET开发人员)

    也许有可能“唤醒”队列

    我将感谢任何帮助!
    感谢您提高效率,MSMQ不会在以下队列上维护性能数据:

  • 空的,和
  • 封闭的
  • 例如,您可以拥有一台具有1000个空队列的机器,如果这些数据被积极维护,它将锁定内存资源。实际上,在应用程序打开空队列之前,它们不会作为分析对象存在

    我关于传出队列的博文与这种情况无关,因为您正在查询有关私有队列的信息

    干杯
    John Breakwell

    为了提高效率,MSMQ不维护以下队列的性能数据:

  • 空的,和
  • 封闭的
  • 例如,您可以拥有一台具有1000个空队列的机器,如果这些数据被积极维护,它将锁定内存资源。实际上,在应用程序打开空队列之前,它们不会作为分析对象存在

    我关于传出队列的博文与这种情况无关,因为您正在查询有关私有队列的信息

    干杯
    约翰·布雷克韦尔

    嗨,约翰,谢谢你的回答。现在,我已经很好地理解了消息队列消耗大量资源的问题。然而,这一部分:“实际上,在应用程序打开空队列之前,它们不会作为要分析的东西存在。”提出了一点问题。查询“非活动”消息队列会导致与无法访问服务器时相同的异常。因此很难判断原因是什么。如果空队列“实际上不存在”,则不可能分析此队列的性能计数器。这真的不可能吗?简单测试:加载性能监视器并尝试添加“MSMQ队列\队列中的消息”对象的实例。您可以从中选择的队列列表将不包括空/非活动队列。一种解决方法是在接收应用程序从不读取的每个队列中放置一条消息。此“keepalive”消息确保队列显示以进行性能监视。显然,对于只从队列顶部自动接收消息的应用程序不起作用。嘿,John,感谢您确认在不使用队列的情况下没有性能计数器。我自己刚检查过(昨天我已经在家了)。我刚刚偶然发现的一件有趣的事情是,如果队列为空,但应用程序仍在从队列接收消息(queue.Receive(timeout)),您仍然可以检查消息计数。这解决了我的问题,因为在我们的自动部署(使用ruby)中,我们在停止windows服务之前检查计数。还将处理之前已停止服务的情况。欢呼这是预期的行为-如果应用程序在队列上有一个打开的句柄(可以是空的,也可以不是空的),那么MSMQ将生成性能数据。嗨,John,谢谢你的回答。现在,我已经很好地理解了消息队列消耗大量资源的问题。然而,这一部分:“实际上,在应用程序打开空队列之前,它们不会作为要分析的东西存在。”提出了一点问题。查询“非活动”消息队列会导致与无法访问服务器时相同的异常。因此很难判断原因是什么。如果空队列“实际上不存在”,则不可能分析此队列的性能计数器。这真的不可能吗?简单测试:加载性能监视器并尝试添加“MSMQ队列\队列中的消息”对象的实例。您可以从中选择的队列列表将不包括空/非活动队列。一种解决方法是在接收应用程序从不读取的每个队列中放置一条消息。此“keepalive”消息确保队列显示以进行性能监视。显然,对于只从队列顶部自动接收消息的应用程序不起作用。嘿,John,感谢您确认在不使用队列的情况下没有性能计数器。我自己刚检查过(昨天我已经在家了)。我刚刚偶然发现的一件有趣的事情是,如果队列为空,但应用程序仍在从队列接收消息(queue.Receive(timeout)),您仍然可以检查消息计数。这解决了我的问题,因为在我们的自动部署(使用ruby)中,我们在停止windows服务之前检查计数。还将处理之前已停止服务的情况。这是预期的行为-如果应用程序在队列上有一个打开的句柄(可以是空的,也可以不是),那么MSMQ将生成性能数据。