【问题标题】:Websphere MQ Queue Depth with XMS.Net使用 XMS.Net 的 Websphere MQ 队列深度
【发布时间】:2012-07-16 03:17:15
【问题描述】:

由于我们在使用 XMS.net 的 IBM 的 Websphere MQ 时遇到了一些问题(Windows 服务有时似乎放弃了侦听队列中的消息),我们希望创建一个简单的应用程序来监控某些队列的深度(或队列上的消息数),以便能够在队列深度超过某个阈值时提醒某人。该应用程序将由任务调度程序按特定时间间隔启动,并“读出”X 个队列的队列深度(可能还有其他一些统计信息)。

我们的 Windows 服务正在使用以下代码,我希望我可以将相同的“知识”用于我们的“监控”应用程序。

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    //Read config values
    string QueueManager = ConfigurationManager.AppSettings["queuemanager"];
    string Channel = ConfigurationManager.AppSettings["channel"];
    string Queue = ConfigurationManager.AppSettings["queue"];
    string HostIP = ConfigurationManager.AppSettings["host"];
    int Port = int.Parse(ConfigurationManager.AppSettings["port"]);

    //Create connection
    var factoryfactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
    var connectionfactory = factoryfactory.CreateConnectionFactory();

    connectionfactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, QueueManager);
    connectionfactory.SetStringProperty(XMSC.WMQ_HOST_NAME, HostIP);
    connectionfactory.SetIntProperty(XMSC.WMQ_PORT, Port);
    connectionfactory.SetStringProperty(XMSC.WMQ_CHANNEL, Channel);
    connectionfactory.SetIntProperty(XMSC.WMQ_BROKER_VERSION, XMSC.WMQ_BROKER_V2);
    connectionfactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);

    Console.WriteLine("Creating connection");
    var connection = connectionfactory.CreateConnection();
    connection.ExceptionListener = new ExceptionListener(OnXMSExceptionReceived);

    //Create a_session
    Console.WriteLine("Creating sessions");
    var session = connection.CreateSession(false, AcknowledgeMode.ClientAcknowledge);

    //Create queue
    Console.WriteLine("Creating queue");
    var queue = session.CreateQueue(string.Format("queue://{0}/{1}", QueueManager, Queue));

我浏览了sessionqueue 等的属性,但当然没有“当前队列深度”属性。我可以在这些对象上使用GetIntProperty()GetLongProperty(),但我不知道使用哪个常量(我见过IBM.XMS.MQC.MQIA_CURRENT_Q_DEPTH,但它包含intGet...Property() 需要@ 987654328@作为参数)。

长话短说:我将如何以上述代码为起点检索队列深度?使用 XMS.Net 有可能吗?

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    我能够使用 MQ API as Shashi suggested 解决它。为此,您需要引用 amqmdnet.dll (C:\Program Files (x86)\IBM\WebSphere MQ\bin\amqmdnet.dll) 并使用以下(示例)代码。请注意,这是一个简单的示例,不包括异常处理等。

    using System;
    using System.Collections;
    using System.Configuration;
    using IBM.WMQ;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Connection properties
                var properties = new Hashtable();
                properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);
                properties.Add(MQC.CHANNEL_PROPERTY, "SOME.CHANNEL.TCP");
                properties.Add(MQC.HOST_NAME_PROPERTY, "12.34.56.78");
                properties.Add(MQC.PORT_PROPERTY, 1416);
    
                var qmgr = new MQQueueManager("MYQMGR", properties);
    
                Console.WriteLine("Local  : {0}", GetQueueDepth(qmgr, "FOO.LOCALQ"));
                Console.WriteLine("Report : {0}", GetQueueDepth(qmgr, "FOO.REPORTQ"));
            }
    
            public static int GetQueueDepth(MQQueueManager queuemgr, string queue)
            {
                return queuemgr.AccessQueue(queue,
                    MQC.MQOO_INPUT_AS_Q_DEF + 
                    MQC.MQOO_FAIL_IF_QUIESCING + 
                    MQC.MQOO_INQUIRE).CurrentDepth;
            }
        }
    }
    

    这比my initial "workaround" 执行得更好。

    【讨论】:

      【解决方案2】:

      无法确定使用 XMS .NET 的队列深度。队列深度特定于消息传递提供程序而不是 JMS/XMS,因此您需要使用 MQ API 来获取队列深度。您可以使用 MQ .NET API 来查找队列深度。 MQQueue.CurrentDepth 将给出队列中的消息数。

      IMO 最好调查一下为什么 XMS .NET 服务停止侦听消息,而不是编写另一个程序来监控队列深度。

      【讨论】:

      • 我找到了一种“解决方法”,使用浏览器(会话对象上的CreateBrowser() 方法)并使用GetEnumerator()MoveNext() 方法来增加计数器。然而,这不是非常理想的。它停止收听的原因是正在调查的内容(它有时会这样做,尽管我们有预感,但无法重现)。与此同时,我们正在创建这个简单的应用程序来尝试“监控”我们的队列并在超过阈值时提醒某人。我会看看 MQ.Net API 看看是否适合我们...
      • @Shashi:CreateQueueCreateTopic有两个版本,一个在ISession,另一个在XMSFactoryFactory。那么你能告诉我们它们之间有什么区别吗?相同的为什么会有两个版本?
      • 我看不出有什么不同。两者都创建相同类型的对象。请注意,队列或主题对象的创建不会在队列管理器上创建队列或主题。这些类保存有关应用程序将创建消费者或生产者的队列/主题的信息。所以仍然需要一个 Session 对象来创建消费者或生产者。希望这会有所帮助。
      • @RobIII,我知道这是很久以前的事了,但我们遇到了同样的问题,监听器只是停止从队列中拉出消息并备份。你说你有“预感”为什么?你能回忆起它是什么和/或分辨率吗?谢谢!
      • 对不起,不记得了。我们最终做的是用另一个进程“监控”队列,如果它超过了某个阈值,我们就会重新启动监听器。管道胶带解决方案,但它有效。从那以后我们就离开了 MQ,谢天谢地...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多