2538 - MQRC_HOST_NOT_AVAILABLE

时间:2017-02-14 13:26:21

标签: .net ibm-mq

我是IBM Websphere MQ的新手

我正在尝试将消息添加到远程websphere MQ队列管理器。我在尝试连接时遇到错误。

此外,我已经尝试过在论坛中提供的许多可能的解决方案,例如将.net框架更改为3.5,我在ping远程计算机时遇到了良好的ping但我无法使用C#代码连接到它。队列管理器侦听器已启动并正在运行,但这是我得到的错误

  

2538 - MQRC_HOST_NOT_AVAILABLE

尝试这样做。

queueManager = new MQQueueManager();

我正在使用.net framework 4.5。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

MQRC_HOST_NOT_AVAILABLE可能意味着您的客户端无法找到您告诉它要查找的队列管理器。鉴于你已经说过你的代码是

  

queueManager = new MQQueueManager();

我怀疑你没有告诉你的.NET需要知道的一些关键信息才能找到队列管理器。为了将MQ客户端连接到队列管理器,它需要知道

  • 要连接的频道
  • 运行队列管理器的计算机的主机名
  • 队列管理器正在运行的端口

对于.NET,这些可以通过knowledge center doc on the MQQueueManager clas s。

中详述的不同方式提供

从该页面可以看到连接到队列管理器的示例代码:

  

MQEnvironment.hostname =" fred.mq.com&#34 ;; //主持人连接

     

MQEnvironment.port = -1; //连接的端口。如果未设置,则对于WebSphereMQ客户端连接,此缺省值为1414。

     

MQEnvironment.channel =" channel.name&#34 ;; //队列管理器上的SVRCONN通道的CASE-SENSITIVE名称

     

MQQueueManager qMgr = new MQQueueManager(" MYQM");

另请注意,创建MQQueueManager的调用也会使用一个参数,该参数是连接到的队列管理器的名称。

检查您是否提供了客户端需要连接的所有必要信息,包括队列管理器的名称。如果它仍然失败,那么检查队列管理器的日志以查找任何错误消息(如果没有客户端真的没有到达队列管理器,否则错误消息将说明为什么队列管理器不是&# 39;没有回应)

答案 1 :(得分:1)

请不要使用MQEnvironment类,因为它不是线程安全的。将所有信息放在Hashtable中并将Hashtable传递给MQQueueManager类要好得多。以下是使用Hashtable for MQ连接信息的MQ .NET托管模式示例:

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

namespace MQTest02
{
   class MQTest02
   {
      private Hashtable inParms = null;
      private Hashtable qMgrProp = null;
      private System.String qManager;
      private System.String outputQName;

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

      /// <summary> Make sure the required parameters are present.</summary>
      /// <returns> true/false
      /// </returns>
      private bool allParamsPresent()
      {
         bool b = inParms.ContainsKey("-h") && inParms.ContainsKey("-p") &&
                  inParms.ContainsKey("-c") && inParms.ContainsKey("-m") &&
                  inParms.ContainsKey("-q");
         if (b)
         {
            try
            {
               System.Int32.Parse((System.String)inParms["-p"]);
            }
            catch (System.FormatException e)
            {
               b = false;
            }
         }

         return b;
      }

      /// <summary> Extract the command-line parameters and initialize the MQ variables.</summary>
      /// <param name="args">
      /// </param>
      /// <throws>  IllegalArgumentException </throws>
      private void init(System.String[] args)
      {
         inParms = Hashtable.Synchronized(new Hashtable());
         if (args.Length > 0 && (args.Length % 2) == 0)
         {
            for (int i = 0; i < args.Length; i += 2)
            {
               inParms[args[i]] = args[i + 1];
            }
         }
         else
         {
            throw new System.ArgumentException();
         }

         if (allParamsPresent())
         {
            qManager = ((System.String)inParms["-m"]);
            outputQName = ((System.String)inParms["-q"]);

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

            qMgrProp.Add(MQC.HOST_NAME_PROPERTY, ((System.String)inParms["-h"]));
            qMgrProp.Add(MQC.CHANNEL_PROPERTY, ((System.String)inParms["-c"]));

            try
            {
               qMgrProp.Add(MQC.PORT_PROPERTY, System.Int32.Parse((System.String)inParms["-p"]));
            }
            catch (System.FormatException e)
            {
               qMgrProp.Add(MQC.PORT_PROPERTY, 1414);
            }

            if (inParms.ContainsKey("-u"))
               qMgrProp.Add(MQC.USER_ID_PROPERTY, ((System.String)inParms["-u"]));

            if (inParms.ContainsKey("-x"))
               qMgrProp.Add(MQC.PASSWORD_PROPERTY, ((System.String)inParms["-x"]));

            if (inParms.ContainsKey("-s"))
               qMgrProp.Add(MQC.SECURITY_EXIT_PROPERTY, ((System.String)inParms["-s"]));

            System.Console.Out.WriteLine("MQTest02:");
            Console.WriteLine("  QMgrName ='{0}'", qManager);
            Console.WriteLine("  Output QName ='{0}'", outputQName);

            System.Console.Out.WriteLine("QMgr Property values:");
            foreach (DictionaryEntry de in qMgrProp)
            {
               Console.WriteLine("  {0} = '{1}'", de.Key, de.Value);
            }
         }
         else
         {
            throw new System.ArgumentException();
         }
      }

      /// <summary> Connect, open queue, read a message, close queue and disconnect.
      ///
      /// </summary>
      /// <throws>  MQException </throws>
      private void testReceive()
      {
         MQQueueManager qMgr = null;
         MQQueue queue = null;
         int openOptions = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING;
         MQGetMessageOptions gmo = new MQGetMessageOptions();
         MQMessage receiveMsg = null;

         try
         {
            qMgr = new MQQueueManager(qManager, qMgrProp);
            System.Console.Out.WriteLine("MQTest02 successfully connected to " + qManager);

            queue = qMgr.AccessQueue(outputQName, openOptions, null, null, null); // no alternate user id
            System.Console.Out.WriteLine("MQTest02 successfully opened " + outputQName);

            receiveMsg = new MQMessage();

            queue.Get(receiveMsg, gmo);
            System.Console.Out.WriteLine("Message Data>>>" + receiveMsg.ReadString(receiveMsg.MessageLength));
         }
         catch (MQException mqex)
         {
            System.Console.Out.WriteLine("MQTest02 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
         }
         catch (System.IO.IOException ioex)
         {
            System.Console.Out.WriteLine("MQTest02 ioex=" + ioex);
         }
         finally
         {
            try
            {
               queue.Close();
               System.Console.Out.WriteLine("MQTest02 closed: " + outputQName);
            }
            catch (MQException mqex)
            {
               System.Console.Out.WriteLine("MQTest02 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
            }
            try
            {
               qMgr.Disconnect();
               System.Console.Out.WriteLine("MQTest02 disconnected from " + qManager);
            }
            catch (MQException mqex)
            {
               System.Console.Out.WriteLine("MQTest02 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
            }
         }
      }

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

         try
         {
            mqt.init(args);
            mqt.testReceive();
         }
         catch (System.ArgumentException e)
         {
            System.Console.Out.WriteLine("Usage: MQTest02 -h host -p port -c channel -m QueueManagerName -q QueueName [-u userID] [-x passwd] [-s securityExit]");
            System.Environment.Exit(1);
         }
         catch (MQException e)
         {
            System.Console.Out.WriteLine(e);
            System.Environment.Exit(1);
         }

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

答案 2 :(得分:0)

问题描述:
操作系统:7.3,MQ版本:8.0.0.5。服务器位于安全区中。

存在一个队列管理器,其服务器连接通道名为
CL_IR360。用户正在尝试连接到它,但是,失败了
与以下错误。

错误消息用户得到:

  • 测试连接失败
  • 与主机“ ip地址(端口)”的连接被拒绝
  • JmqiException CC = 2 RC = 2538 AMQ9213
  • 发生TCP通信错误
  • java.net.SocketTimeoutException-连接超时
  • 与主机IP地址(端口)的连接被拒绝
  • MQxx主机2538不可用

在此特定情况下的上述错误是由于以下事实造成的: 服务器连接通道的通道权限(SET CHLAUTH)设置。 添加了通道权限,并解决了错误。