【问题标题】:2538 - MQRC_HOST_NOT_AVAILABLE第2538章
【发布时间】:2019-01-16 22:43:16
【问题描述】:

我是 IBM Websphere MQ 的新手

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

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

2538 - MQRC_HOST_NOT_AVAILABLE

在尝试这样做时。

queueManager = new MQQueueManager();

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

【问题讨论】:

    标签: .net ibm-mq


    【解决方案1】:

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

    queueManager = new MQQueueManager();

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

    • 要连接的通道
    • 运行队列管理器的机器的主机名
    • 运行队列管理器的端口

    对于 .NET,可以通过 knowledge center doc on the MQQueueManager class 中详述的不同方式提供这些。

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

    MQEnvironment.hostname = "fred.mq.com"; // 要连接的主机

    MQEnvironment.port = -1; // 要连接的端口。如果未设置,WebSphereMQ 客户端连接默认为 1414。

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

    MQQueueManager qMgr = new MQQueueManager("MYQM");

    还请注意,创建 MQQueueManager 的调用还需要一个参数,该参数是连接到的队列管理器的名称。

    检查您是否提供了客户端连接所需的所有必要信息,包括队列管理器的名称。如果仍然失败,则检查队列管理器的日志中是否有任何错误消息(如果没有,则客户端确实没有到达队列管理器,否则错误消息将说明队列管理器没有响应的原因)

    【讨论】:

      【解决方案2】:

      请不要使用 MQEnvironment 类,因为它不是线程安全的。最好将所有信息放在一个 Hashtable 中并将 Hashtable 传递给 MQQueueManager 类。这是一个使用 Hashtable 获取 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);
            }
         }
      }
      

      【讨论】:

        【解决方案3】:

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

        存在具有名为
        的服务器连接通道的队列管理器 CL_IR360。用户正在尝试连接它,但是它失败了
        出现以下错误。

        用户收到的错误消息:

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

        在这种特殊情况下出现上述错误是由于没有 通道权限 (SET CHLAUTH) 设置为服务器连接通道。 添加了频道权限并解决了错误。

        【讨论】:

        • 问题是关于 .net,而不是 java。您确实拥有上述所有信息来提出自己的问题然后自己回答,这可能是获取此信息的更好地方。
        • SET CHLAUTH 用于频道 身份验证 不用于授权。