4

XMS.net (キューでのメッセージのリッスンを時々あきらめるように見える Windows サービス) を使用する IBM の Websphere MQ で問題が発生しているため、いくつかのキューの深さ (またはメッセージの数) を監視する簡単なアプリケーションを作成したいと考えています。キューの深さが特定のしきい値を超えたときに誰かに警告できるようにします。このアプリケーションは、特定の間隔でタスク スケジューラによって起動され、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));

などのプロパティをsession参照しましqueueたが、もちろん、「現在のキューの深さ」プロパティはありません。GetIntProperty()これらのオブジェクトに対してorを使用できGetLongProperty()ますが、そのために使用する定数がわかりません (IBM.XMS.MQC.MQIA_CURRENT_Q_DEPTH を見たことがありますが、これには が含まれておりint、パラメーターとしてGet...Property()期待stringされています)。

簡単に言えば、上記のコードを出発点としてキューの深さを取得するにはどうすればよいですか? XMS.Net を使用することはまったく可能ですか?

4

2 に答える 2

5

Shashiが提案したように、MQ APIを使用して解決できました。このためには、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;
        }
    }
}

これは、最初の「回避策」よりも優れたパフォーマンスを発揮します。

于 2012-07-17T10:34:36.050 に答える
3

XMS.NETキューの深さを使用して決定することはできません。キューの深さは、JMS / XMSではなくメッセージングプロバイダーに固有であるため、キューの深さを取得するにはMQAPIを使用する必要があります。MQ .NET APIを使用して、キューの深さを見つけることができます。MQQueue.CurrentDepthは、キュー内のメッセージの数を示します。

IMOキューの深さを監視する別のプログラムを作成するよりも、XMS.NETサービスがメッセージのリッスンを停止した理由を調査することをお勧めします。

于 2012-07-17T09:50:26.893 に答える