【问题标题】:IBM MQ Server Setup to Create CCDT file used by .NET ClientIBM MQ 服务器设置以创建 .NET 客户端使用的 CCDT 文件
【发布时间】:2018-09-25 15:09:38
【问题描述】:

我需要使用 MQ.NET 客户端的 CCDT 文件连接到 MQ 服务器,两者都在本地运行,但出现以下错误。

IBM.WMQ.MQException: MQRC_Q_MGR_NAME_ERROR CompCode: 2, Reason: 2058

请在下面找到服务器设置和 MQ.NET 客户端。

服务器设置

我按照以下链接设置并创建了 CCDT 文件:

Setting up the server using IBM MQ Explorer

服务器连接通道:LOCAL.DEF.SVRCONN

MCA 用户 ID:我尝试忽略它或提供它。以及是否是 mqm 的成员。

Setting up the client using IBM MQ Explorer

客户端通道:LOCAL.DEF.SVRCONN

队列管理器名称:LocalQM

连接名称:192.168.1.9 (1415)

192.168.1.9 是本地主机地址

1415 是队列管理器,LocalQM,TCP 端口。

IBM MQ.NET

下面的代码来自here

        MQQueueManager qm = null;
        System.Environment.SetEnvironmentVariable("MQCHLLIB", "C:\\ProgramData\\IBM\\MQ\\qmgrs\\LocalQM\\@ipcc");
        System.Environment.SetEnvironmentVariable("MQCHLTAB", "AMQCLCHL.TAB");

        try
        {
            Hashtable props = new Hashtable();
            props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);
            qm = new MQQueueManager("LocalQM",props);
            MQQueue queue1 = qm.AccessQueue("LocalQueue", MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING);
            MQMessage msg = new MQMessage();
            msg.WriteUTF("Hello this message is from .net client");
            queue1.Put(msg);
            queue1.Close();
            qm.Disconnect();
        }
        catch (Exception ex)
        {
            Console.Write(ex);
        }

Windows 10 上的 IBM MQ V8

Windows 10 上的 MQ.NET 客户端 V8

Creating a client channel definition table

Using a client channel definition table with .NET

更新

如果我在不使用 CCDT 的情况下更改为以下,它可以工作。

   var properties = new Hashtable
        {
            {MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },         
             { MQC.HOST_NAME_PROPERTY, "192.168.1.9" }, //"localhost" },
        { MQC.PORT_PROPERTY, "1415"},
        { MQC.CHANNEL_PROPERTY, "LOCAL.DEF.SVRCONN" },
            {MQC.USER_ID_PROPERTY, "xxx" },  //usrename
            {MQC.PASSWORD_PROPERTY, "xxx" }  //password
        };
        _queueManager = new MQQueueManager(_queueManagerName, properties);

更新 2 我将队列管理器更改为 LocalQM

C:\Users\'#.lp\source>SET MQCHLLIB=C:\ProgramData\IBM\MQ\qmgrs\LocalQM\@ipcc

C:\Users\'#.lp\source>SET MQCHLTAB=AMQCLCHL.TAB

C:\Users\'#.lp\source>echo DIS CHL(LOCAL.DEF.SVRCONN) CHLTYPE(CLNTCONN) ALL | runmqsc -n
5724-H72 (C) Copyright IBM Corp. 1994, 2015.
Starting local MQSC for 'AMQCLCHL.TAB '.

     1 : DIS CHL(LOCAL.DEF.SVRCONN) CHLTYPE(CLNTCONN) ALL
AMQ8414: Display Channel details.
   CHANNEL(LOCAL.DEF.SVRCONN)              CHLTYPE(CLNTCONN)
   AFFINITY(PREFERRED)                     ALTDATE(2018-04-16)
   ALTTIME(22.16.03)                       CERTLABL( )
   CLNTWGHT(0)                             COMPHDR(NONE)
   COMPMSG(NONE)                           CONNAME(192.168.1.9 (1415))
   DEFRECON(NO)                            DESCR( )
   HBINT(300)                              KAINT(AUTO)
   LOCLADDR( )                             MAXMSGL(4194304)
   MODENAME( )                             PASSWORD( )
   QMNAME(LocalQM)                         RCVDATA( )
   RCVEXIT( )                              SCYDATA( )
   SCYEXIT( )                              SENDDATA( )
   SENDEXIT( )                             SHARECNV(10)
   SSLCIPH( )                              SSLPEER( )
   TPNAME( )                               TRPTYPE(TCP)
   USERID( )
No commands have a syntax error.

C:\Users\'#.lp\source>

更新 3:MQRC_NOT_AUTHORIZED 未解决

我变了

  1. 192.168.1.9 (1415) -> 192.168.1.9(1415)
  2. 将 AMQCLCHL.TAB 也放入 C:\ProgramData\IBM\MQ (我不知道为什么哪个可能不正确,因为日志文件出错:

    AMQ9518:找不到文件“C:\ProgramData\IBM\MQ\AMQCLCHL.TAB”。

)

3 我试过了 MCA 用户 ID ->

1个mqlclient是mqm的成员

2个不是mqm成员的mqlclient

3 空

但仍然有错误。下面是 3.1 的异常和错误

IBM.WMQ.MQException: MQRC_NOT_AUTHORIZED

----- cmqxrsrv.c : 2356 -------------------------------------------------------
17/04/2018 23:50:44 - Process(1848.16) User(SYSTEM) Program(amqzlaa0.exe)
                      Host(APPLE) Installation(Installation1)
                      VRMF(8.0.0.5) QMgr(LocalQM)

AMQ5540: Application 'bin\Debug\Producer.exe' did not supply a user ID
and password

EXPLANATION:
The queue manager is configured to require a user ID and password, but none was
supplied.
ACTION:
Ensure that the application provides a valid user ID and password, or change
the queue manager configuration to OPTIONAL to allow applications to connect
which have not supplied a user ID and password. 
----- amqzfuca.c : 4311 -------------------------------------------------------
17/04/2018 23:50:44 - Process(1848.16) User(SYSTEM) Program(amqzlaa0.exe)
                      Host(APPLE) Installation(Installation1)
                      VRMF(8.0.0.5) QMgr(LocalQM)

AMQ5541: The failed authentication check was caused by the queue manager
CONNAUTH CHCKCLNT(REQDADM) configuration.

EXPLANATION:
The user ID 'mqclient' and its password were checked because the user ID is
privileged and the queue manager connection authority (CONNAUTH) configuration
refers to an authentication information (AUTHINFO) object named
'SYSTEM.DEFAULT.AUTHINFO.IDPWOS' with CHCKCLNT(REQDADM). 

This message accompanies a previous error to clarify the reason for the user ID
and password check.
ACTION:
Refer to the previous error for more information. 

Ensure that a password is specified by the client application and that the
password is correct for the user ID. The authentication configuration of the
queue manager connection determines the user ID repository. For example, the
local operating system user database or an LDAP server. 

To avoid the authentication check, you can either use an unprivileged user ID
or amend the authentication configuration of the queue manager. You can amend
the CHCKCLNT attribute in the CHLAUTH record, but you should generally not
allow unauthenticated remote access. 
-------------------------------------------------------------------------------
17/04/2018 23:50:45 - Process(14900.9) User(SYSTEM) Program(amqrmppa.exe)
                      Host(APPLE) Installation(Installation1)
                      VRMF(8.0.0.5) QMgr(LocalQM)

AMQ9557: Queue Manager User ID initialization failed for 'mqclient'.

EXPLANATION:
The call to initialize the User ID 'mqclient' failed with CompCode 2 and Reason
2035.
ACTION:
Correct the error and try again. 
----- cmqxrsrv.c : 2356 -------------------------------------------------------

【问题讨论】:

  • 在创建客户端连接通道时,您是否设置了队列管理器名称?如果未设置队列管理器名称,那么您会看到该异常
  • 我已经设置了 QM 名称,如帖子中所述。
  • 您是否创建了客户端连接通道?您需要创建同名的客户端连接和服务器连接通道。第 41 页中的以下文档将帮助您创建使用 CCDT 所需的设置www-01.ibm.com/support/docview.wss?uid=swg27024109&aid=1
  • @JoshMc,帖子中已经提到了两者:Clinet 通道:LOCAL.DEF.SVRCONN 队列管理器名称:QM1 连接名称:192.168.1.9 (1415)
  • @subbaraoc 请参见上文,因为 SO 不允许多个用户。

标签: c# ibm-mq


【解决方案1】:

一般来说,原因码 2058 (MQRC_Q_MGR_NAME_ERROR) 表示您的队列管理器名称无效或服务器没有该特定队列管理器。检查您输入的队列管理器名称的拼写。此外,队列管理器名称区分大小写(例如,MQA1 与 mqa1 不同)。

此外,每个队列管理器都有自己的端口号。即 1414、1415、1416 等。因此,如果该服务器上运行的队列管理器超过 1 个,请确保您使用的是正确的端口。

System.Environment.SetEnvironmentVariable("MQCHLLIB", "C:\\ProgramData\\IBM\\MQ\\qmgrs\\QM1\\@ipcc");
System.Environment.SetEnvironmentVariable("MQCHLTAB", "AMQCLCHL.TAB");

尝试在启动程序之前设置环境变量,而不是从程序内部设置。我在 Windows 和/或 .NET 中发现了一些奇怪的问题,即在程序中设置环境变量 - 有时有效,有时无效。

最后,您是否在运行队列管理器的同一台服务器上运行您的应用程序?如果是这样,则以“绑定模式”而不是“客户端模式”连接。由于不涉及网络,绑定模式会更快。

【讨论】:

  • 我检查了正确指定的队列管理器名称。端口名称正确,例如Client 连接的连接名称为 192.168.1.9 (1415)。我使用 SET MQCHLLIB=,因此代码中没有使用 SetEnvironmentVariable。他们都还没有工作。如何更改绑定模式?
  • 好吧,看来您没有正确创建 CCDT 文件。
  • 为什么这么说?创建 CCDT 文件的正确方法是什么?
  • 为什么这么说?创建 CCDT 文件的正确方法是什么?
【解决方案2】:

OP 在 UPDATE 2 中的问题中添加了以下信息:

  1. SET MQCHLLIB=C:\ProgramData\IBM\MQ\qmgrs\QM1\@ipcc
  2. SET MQCHLTAB=AMQCLCHL.TAB
  3. echo DIS CHL(LOCAL.DEF.SVRCONN) CHLTYPE(CLNTCONN) ALL | runmqsc -n

我发现 CCDT 可能存在两个问题:

  1. CONNAME 在 IP 和左括号之间有一个空格。这可能会导致 MQ 忽略端口 1415 并使用默认端口 1414,它也可能忽略空间,这可能不是问题,我从未测试过空间。

    COMPMSG(NONE)                           CONNAME(192.168.1.9 (1415))
    
  2. CLNTCONN 频道的QMNAME 应该与您在调用new MQQueueManager 时指定的内容相匹配,所以这应该是QM1 而不是LocalQM,这可能是您的2058 的直接原因错误,但修复 #2 后,#1 也可能会导致问题。

    QMNAME(LocalQM)                         RCVDATA( )
    

QMNAME 还有其他用途,您可以在其中指定组名或空白。有关更多详细信息,请参阅我对“Connecting to IBM MQ using CCDT file in JMS ”的回答。答案与 JMS 有关,但为 setQueueManager 提供的信息将与您调用 new MQQueueManager 的第一个参数相同。

【讨论】:

  • 感谢您的困惑。后来我把所有的代码都改成了 LocalQM。我也更新了代码。我会在这篇文章中更新它。
  • 如果队列管理器名称实际上是LocalQM,那么您应该解决点#1 并删除CONNAME 中的空格,看看这是否会导致您的问题。另请注意,使用混合大小写不是一个好习惯。在 MQ 中,它会在许多情况下折叠为大写,除非您将内容放在单引号 ' 中。使用所有大写的队列管理器名称和队列名称非常好。
  • 请看更新3,你觉得还是和case有关吗?
  • 您现在已成功使用 CCDT 连接到您的队列管理器。继续讨论有关您的 2035 问题的另一个问题,或在 StackOverflow 上搜索,因为还有其他答案可以解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2013-04-07
  • 1970-01-01
  • 2011-07-22
  • 2013-02-28
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多