2012-01-18 63 views
1

我在查询远程msmq队列的消息数时遇到了问题。用ruby读取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地址。

这种方法实际上可以作为一个魅力,但:

  1. 如果队列为空,然后我不断收到一定的时间后此错误:

    '的method_missing':初始化(WIN32OLERuntimeError ) OLE错误代码:MSMQManagement中的C00E0004 队列未打开或可能不存在。 HRESULT错误代码:0x80020009 发生异常。

  2. 如果队列中还有项目,那么这个方法就像它应该的那样工作。

我发现这篇文章:How do I create an MSMQ outgoing queue? 它说:

MSMQ保持以防万一你要发送另一个消息队列活着(即使是空的)几分钟。这节省了队列管理器再次进行网络连接的努力。此清理延迟由CleanupInterval注册表值控制 - 客户端为5分钟,服务器为2分钟。

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

也许有可能“唤醒”队列?

我将不胜感激任何帮助! 谢谢

回答

1

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

  1. 空,并
  2. 关闭

你可以,例如,有一台机器如果这些数据被主动维护,那么将有1000个空队列将锁定内存资源。实际上,在应用程序打开之前,空队列不会作为要分析的事物存在。

由于您正在查询有关专用队列的信息,因此有关传出队列的博文与此情况无关。

干杯 John Breakwell

+1

嗨,John,谢谢你的回答。 现在我很清楚这个消息队列消耗很多资源的问题。 但是这部分: “实际上,空队列不会作为要分析的东西存在,直到它们被应用程序打开为止。”存在一些问题。查询“不活动”消息队列会导致与服务器无法访问时相同的异常。所以很难说出原因是什么。如果空队列“实际上不存在”,则不应该可以分析此队列的性能计数器。这真的不可能吗? – Helikaon 2012-01-18 20:51:34

+0

简单测试:加载性能监视器并尝试添加“队列中的MSMQ队列\消息”对象的实例。您可以选择的队列列表将不包括空闲/非活动队列。 – 2012-01-18 22:35:32

+0

解决方法之一是在接收应用程序从不读取的每个队列中放入一条消息。此“keepalive”消息确保队列显示用于性能监视。显然不适用于自动从队列顶部接收消息的应用程序。 – 2012-01-18 22:37:37