我的任务是向(到目前为止)未知的MQ端点发送测试消息。
我已经在服务器上安装了IBMSMQV8.0.0.5的试用版,我相信它的配置是正确的。
但是,考虑到下面包含的代码,我得到了一个例外:
IBM.WMQ.MQException类型的未处理异常发生在amqmdnet.dll中 补充资料: 2059
或者,如果我使用的是localhost而不是远程服务器名,那么构造函数行就会挂起。
这是C#:
Hashtable connectionProperties = new Hashtable();
string connectionType = MQC.TRANSPORT_MQSERIES_MANAGED
connectionProperties.Add(MQC.TRANSPORT_PROPERTY, connectionType);
// Set up the rest of the connection properties, based on the
// connection type requested
switch (_connectionType)
{
    case MQC.TRANSPORT_MQSERIES_BINDINGS:
        break;
    case MQC.TRANSPORT_MQSERIES_CLIENT:
    case MQC.TRANSPORT_MQSERIES_XACLIENT:
    case MQC.TRANSPORT_MQSERIES_MANAGED:
        connectionProperties.Add(MQC.HOST_NAME_PROPERTY, "server.com");
        connectionProperties.Add(MQC.CHANNEL_PROPERTY, "SYSTEM.DEF.CLNTCONN");      
        break;
}
MQQueueManager qMgr = new MQQueueManager("test", connectionProperties);
MqClientTest mqClientTest=new MqClientTest("TEST_QM","localhost", "SYSTEM.DEF.CLNTCONN");这里面有我们遗漏的东西吗?
更新1:
在amqerr01.log文件夹中的errors文件中,我们现在有了文本:
AMQ6183:发生了内部WebSphere MQ错误。
更新2:
“内部WebSphere MQ错误”可能是因为我对1414端口进行了探测,以查看端口是否“启动”并侦听。很明显它不喜欢我这么做。
更新3:
@Roger建议我使用127.0.0.1和大写,我现在已经应用了它们,并将上面的示例更改为反映。
@JoshMc善意地指向Queue文件夹中的第二个AMQERR01.LOG文件。我现在得到了错误:
14/11/2017 15:35:08 -进程(336.6)用户程序(amqrmppa.exe)主机安装(Xxxx) VRMF(8.0.0.5) QMgr(TEST_QM) AMQ9519:频道'SYSTEM.DEF.CLNTCONN‘找不到。 说明:请求的操作失败,因为程序找不到通道'SYSTEM.DEF.CLNTCONN‘的定义。
TEST_QM是我的队列管理器,默认为(?)信道SYSTEM.DEF.CLNTCONN
发布于 2017-11-14 16:20:10
对于IBM,总是有一对通道一起工作。例如,如果一个MQ队列管理器需要向另一个队列管理器发送消息,它通常会定义一个SDR (发件人)通道,该通道将指向另一个队列管理器上同名的RCVR (接收者)通道。
对于MQ客户端连接,通道的客户端应用程序端称为MQCD,MQ队列管理器端是SVRCONN (服务器连接)通道。客户端MQCD可以通过几种不同的方式指定。您在发布的示例中演示的方式是以编程方式指定MQCD信息(通道名称、主机名等)。
另一种指定信息的方法是指向一个CCDT (客户端信道定义表),它通常被称为通道表,这是使用CLNTCONN通道的地方,因为您没有使用通道表,所以我将继续讨论为什么会出现错误,但是在这个答案的末尾,我将提供更多关于通道表的详细信息。
总之,您的应用程序应该是而不是将CLNTCONN通道指定为MQC.CHANNEL_PROPERTY,它应该指向SVRCONN通道。
有两件事要注意:
SYSTEM.*通道(例如SYSTEM.DEF.SVRCONN),您应该为您的应用程序定义一个要使用的新通道。默认通道用于保存在创建相同类型的新通道时希望成为默认值的参数。CHLAUTH规则,这将阻止对SYSTEM.*通道的访问。如果要使用SVRCONN上的命令行程序runmqsc定义runmqsc通道,请在CMD提示符下运行以下命令:
echo DEFINE CHL(TEST_QM_CHANNEL1) CHLTYPE(SVRCONN)|runmqsc TEST_QM关于频道表的详细信息不多:
在MQ v8之前,生成通道表的唯一受支持方法是在队列管理器上定义CLNTCONN通道,在名为@ipcc的目录中的队列管理器名称文件夹下创建一个名为AMQCLCHL.TAB的文件。队列管理器附带一个称为SYSTEM.DEF.CLNTCONN的通道的原因是在创建新的CLNTCONN通道时提供默认值。使用v8和更高版本,您可以只使用runmqsc -n模式创建通道表,这将直接编辑通道表和需要在队列管理器上创建CLNTCONN通道的通道表。v8和以后版本的MQ客户端提供了一个客户端版本的runmqsc,可用于创建和更改通道表。
应用程序可以通过几种不同的方式指向通道表文件,常见的方法是设置两个环境变量(MQCHLLIB和MQCHLTAB)。然后应用程序不会在程序中指定通道名、主机名等,它只需要指定要连接到的队列管理器的名称。
IBM v7.5 (或更高版本)知识中心页面"将IBM客户端应用程序连接到队列管理器“记录了MQ查找连接信息的顺序和位置。注意,此链接用于MQI客户端,但同样的基本顺序也适用于.NET客户端。
发布于 2017-11-10 20:42:06
本地主机
尝试使用127.0.0.1而不是本地主机。
"rx“和"swift_test_tx”
因为您是MQ的新手,所以现在是您了解MQ最佳实践的时候了。有一项是,对MQ对象名称使用小写字符不是一个好主意。例如排队、频道等..。MQ将始终将没有引号的任何名称折叠为大写。所以,最好用大写的名字开头(将来的问题少一些)。
接下来,您是否在防火墙中打开了端口1414?如果没有,那么打开TCP和UDP的端口。
下面是一个将消息放入远程队列管理器中的C#程序的示例:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using IBM.WMQ;
/// <summary> Program Name
/// MQTest51
///
/// Description
/// This C# class will connect to a remote queue manager
/// and put a message to a queue under a managed .NET environment.
///
/// Sample Command Line Parameters
/// -h 127.0.0.1 -p 1414 -c TEST.CHL -m MQWT1 -q TEST.Q1
///
/// </summary>
namespace MQTest51
{
   class MQTest51
   {
      private Hashtable inParms = null;
      private Hashtable qMgrProp = null;
      private System.String qManager;
      private System.String outputQName;
      /*
      * The constructor
      */
      public MQTest51()
         : 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("-u")) && (inParms.ContainsKey("-x")) )
               qMgrProp.Add(MQC.USE_MQCSP_AUTHENTICATION_PROPERTY, true);
         }
         else
         {
            throw new System.ArgumentException();
         }
      }
      /// <summary> Connect, open queue, write a message, close queue and disconnect.
      ///
      /// </summary>
      /// <throws>  MQException </throws>
      private void testSend()
      {
         System.String line;
         int openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
         try
         {
            MQQueueManager _qMgr = new MQQueueManager(qManager, qMgrProp);
            System.Console.Out.WriteLine("MQTest51 successfully connected to " + qManager);
            MQQueue queue = _qMgr.AccessQueue(outputQName, openOptions, null, null, null); // no alternate user id
            System.Console.Out.WriteLine("MQTest51 successfully opened " + outputQName);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            // Define a simple MQ message, and write some text in UTF format..
            MQMessage sendmsg = new MQMessage();
            sendmsg.Format = MQC.MQFMT_STRING;
            sendmsg.Feedback = MQC.MQFB_NONE;
            sendmsg.MessageType = MQC.MQMT_DATAGRAM;
            line = "This is a test message embedded in the MQTest51 program.";
            sendmsg.MessageId = MQC.MQMI_NONE;
            sendmsg.CorrelationId = MQC.MQCI_NONE;
            sendmsg.WriteString(line);
            // put the message on the queue
            queue.Put(sendmsg, pmo);
            System.Console.Out.WriteLine("Message Data>>>" + line);
            queue.Close();
            System.Console.Out.WriteLine("MQTest51 closed: " + outputQName);
            _qMgr.Disconnect();
            System.Console.Out.WriteLine("MQTest51 disconnected from " + qManager);
         }
         catch (MQException mqex)
         {
            System.Console.Out.WriteLine("MQTest51 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
         }
         catch (System.IO.IOException ioex)
         {
            System.Console.Out.WriteLine("MQTest51 ioex=" + ioex);
         }
      }
      /// <summary> main line</summary>
      /// <param name="args">
      /// </param>
      //        [STAThread]
      public static void Main(System.String[] args)
      {
         MQTest51 write = new MQTest51();
         try
         {
            write.init(args);
            write.testSend();
         }
         catch (System.ArgumentException e)
         {
            System.Console.Out.WriteLine("Usage: MQTest51 -h host -p port -c channel -m QueueManagerName -q QueueName [-u userID] [-x passwd]");
            System.Environment.Exit(1);
         }
         catch (MQException e)
         {
            System.Console.Out.WriteLine(e);
            System.Environment.Exit(1);
         }
         System.Environment.Exit(0);
      }
   }
}https://stackoverflow.com/questions/47223553
复制相似问题