Просматривайте IBM MQ без сообщений - PullRequest
0 голосов
/ 28 января 2020

Здравствуйте, я новичок в среде IBM MQ, поэтому мне нужна ваша помощь .... Мне нужно разработать сценарий, который проверяет очередь IBMMQ (за пределами моей фабрики), чтобы проверить, есть ли сообщения, ожидающие получения из моего приложения -сервер (я имею в виду, если мой сервер приложений потерял соединение с IBMMQ по какой-либо причине, я хочу, чтобы меня информировали, в этом режиме я могу принять исправление). Если возможно, мне нужен скрипт в PowereShell или C#. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Существует пример кода, с которого можно начать - https://github.com/ibm-messaging/mq-dev-patterns/blob/master/dotnet/dotNetGet.cs

заменить вызов метода CreateConsumer на CreateBrowser

ie. измененный фрагмент становится

        private void ReceiveMessagesFromEndpoint(IConnectionFactory cf)
        {
            IConnection connectionWMQ;
            ISession sessionWMQ;
            IDestination destination;
            IMessageBrowser browser;
            ITextMessage textMessage;

            // Create connection.
            connectionWMQ = cf.CreateConnection();
            Console.WriteLine("Connection created");

            // Create session
            sessionWMQ = connectionWMQ.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
            Console.WriteLine("Session created");

            // Create destination
            destination = sessionWMQ.CreateQueue(env.Conn.queue_name);
            Console.WriteLine("Destination created");

            // Create browser
            browser = sessionWMQ.CreateBrowser(destination);
            Console.WriteLine("Browser created");

            ...

Инструкции по настройке доступны в соответствующем файле readme - https://github.com/ibm-messaging/mq-dev-patterns/blob/master/dotnet/README.md

0 голосов
/ 29 января 2020

Не просматривайте очередь, чтобы узнать текущую глубину очереди, так как это приведет к чрезмерному количеству сетевого трафика c и совершенно не нужно.

Вот пример программы на C # /. NET / MQ ( полностью функциональный), который запросит в очереди текущую глубину.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Text;
using IBM.WMQ;

/// <summary> Program Name
/// MQTest75
///
/// Description
/// This C# class will connect to a remote queue manager
/// and inquire on the current depth of the queue using a managed .NET environment.
///
/// </summary>
/// <author>  Roger Lacroix
/// </author>
namespace MQTest75
{
   class MQTest75
   {
      private Hashtable qMgrProp = null;
      private System.String qManager;
      private System.String inputQName;

      /*
      * The constructor
      */
      public MQTest75()
         : base()
      {
      }

      /// <summary> Make sure the required parameters are present.</summary>
      /// <returns> true/false
      /// </returns>
      private bool allParamsPresent()
      {
         bool b = false;

         if ( (ConfigurationManager.AppSettings["ConnectionName"] != null) &&
              (ConfigurationManager.AppSettings["Port"] != null) &&
              (ConfigurationManager.AppSettings["ChannelName"] != null) &&
              (ConfigurationManager.AppSettings["QMgrName"] != null) &&
              (ConfigurationManager.AppSettings["QueueName"] != null) )
         {
            try
            {
               System.Int32.Parse(ConfigurationManager.AppSettings["Port"]);
               b = true;
            }
            catch (System.FormatException e)
            {
               b = false;
            }
         }

         return b;
      }

      /// <summary> Extract the configuration applicaiton settings and initialize the MQ variables.</summary>
      /// <param name="args">
      /// </param>
      /// <throws>  IllegalArgumentException </throws>
      private void init(System.String[] args)
      {
         if (allParamsPresent())
         {
            qManager = ConfigurationManager.AppSettings["QMgrName"];
            inputQName = ConfigurationManager.AppSettings["QueueName"];

            qMgrProp = new Hashtable();
            qMgrProp.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);

            qMgrProp.Add(MQC.HOST_NAME_PROPERTY, ConfigurationManager.AppSettings["ConnectionName"]);
            qMgrProp.Add(MQC.CHANNEL_PROPERTY, ConfigurationManager.AppSettings["ChannelName"]);

            try
            {
               qMgrProp.Add(MQC.PORT_PROPERTY, System.Int32.Parse(ConfigurationManager.AppSettings["Port"]));
            }
            catch (System.FormatException e)
            {
               qMgrProp.Add(MQC.PORT_PROPERTY, 1414);
            }

            if (ConfigurationManager.AppSettings["UserId"] != null)
               qMgrProp.Add(MQC.USER_ID_PROPERTY, ConfigurationManager.AppSettings["UserId"]);

            if (ConfigurationManager.AppSettings["Password"] != null)
               qMgrProp.Add(MQC.PASSWORD_PROPERTY, ConfigurationManager.AppSettings["Password"]);

            logger("Parameters:");
            logger("  QMgrName ='" + qManager + "'");
            logger("  Queue Name ='" + inputQName + "'");

            logger("Connection values:");
            foreach (DictionaryEntry de in qMgrProp)
            {
               logger("  " + de.Key + " = '" + de.Value + "'");
            }
         }
         else
         {
            throw new System.ArgumentException();
         }
      }

      /// <summary> Connect, open queue, output the current queue depth, close queue and disconnect.</summary>
      /// <throws>  MQException </throws>
      private void handleIt()
      {
         MQQueueManager qMgr = null;
         MQQueue inQ = null;
         int openOptions = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING;

         try
         {
            qMgr = new MQQueueManager(qManager, qMgrProp);
            logger("Successfully connected to " + qManager);

            inQ = qMgr.AccessQueue(inputQName, openOptions);
            logger("Successfully opened " + inputQName);

            logger("Current queue depth is " + inQ.CurrentDepth);
         }
         catch (MQException mqex)
         {
            logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
         }
         catch (System.IO.IOException ioex)
         {
            logger("Error: ioex=" + ioex);
         }
         finally
         {
            try
            {
                if (inQ != null)
                {
                    inQ.Close();
                    logger("Closed: " + inputQName);
                }
            }
            catch (MQException mqex)
            {
                logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
            }

            try
            {
                if (qMgr != null)
                {
                    qMgr.Disconnect();
                    logger("Disconnected from " + qManager);
                }
            }
            catch (MQException mqex)
            {
                logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
            }
         }
      }

      /// <summary> Output the log message to stdio.</summary>
      /// <param name="data">
      /// </param>
      private void logger(String data)
      {
         DateTime myDateTime = DateTime.Now;
         System.Console.Out.WriteLine(myDateTime.ToString("yyyy/MM/dd HH:mm:ss.fff") + " " + this.GetType().Name + ": " + data);
      }

      /// <summary> main line</summary>
      /// <param name="args">
      /// </param>
      //        [STAThread]
      public static void Main(System.String[] args)
      {
         MQTest75 mqt = new MQTest75();

         try
         {
            mqt.init(args);
            mqt.handleIt();
         }
         catch (System.ArgumentException e)
         {
            System.Console.Out.WriteLine("Check your configuration file for an incorrect parameter.");
            System.Environment.Exit(1);
         }
         catch (MQException e)
         {
            System.Console.Out.WriteLine(e);
            System.Environment.Exit(1);
         }

         System.Environment.Exit(0);
      }
   }
}

Просто создайте конфигурацию с именем MQTest75.exe.config и вставьте следующее в это:

<configuration>
  <appSettings>
    <add key="QMgrName" value="MQA1"/>
    <add key="ConnectionName" value="10.10.10.10"/>
    <add key="Port" value="1414"/>
    <add key="ChannelName" value="TEST.CHL"/>
    <add key="QueueName" value="TEST.Q1"/>
    <add key="UserId" value="tester"/>
    <add key="Password" value="mypwd"/>
  </appSettings>
</configuration>
...