[英]IBM MQ Server Setup to Create CCDT file used by .NET Client
我需要对MQ.NET客户端使用CCDT文件才能连接到MQ Server,两者都在本地运行,但是下面出现错误。
IBM.WMQ.MQException: MQRC_Q_MGR_NAME_ERROR CompCode: 2, Reason: 2058
请在下面的服务器设置和MQ.NET客户端中找到。
服务器设置
我通过以下链接设置并创建了CCDT文件:
服务器连接通道:LOCAL.DEF.SVRCONN
MCA用户ID:我尝试省略它或提供它。 mqm的成员之一,也可以不是。
Clinet频道:LOCAL.DEF.SVRCONN
队列管理器名称:LocalQM
连接名称:192.168.1.9(1415)
192.168.1.9是本地主机地址
1415是队列管理器, LocalQM
,TCP端口。
IBM MQ.NET
代码从这里下面
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 Client V8
UPDATE
如果我不使用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未解决
我变了
将AMQCLCHL.TAB也放到C:\\ ProgramData \\ IBM \\ MQ(我不知道为什么这可能不正确,因为日志文件上的错误:
AMQ9518:找不到文件'C:\\ ProgramData \\ IBM \\ MQ \\ AMQCLCHL.TAB'。
)
3我尝试了MCA用户ID->
1位是mqm成员的mqlclient
不是mqm成员的2个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 -------------------------------------------------------
OP在UPDATE 2问题中添加了以下信息:
SET MQCHLLIB=C:\\ProgramData\\IBM\\MQ\\qmgrs\\QM1\\@ipcc
SET MQCHLTAB=AMQCLCHL.TAB
echo DIS CHL(LOCAL.DEF.SVRCONN) CHLTYPE(CLNTCONN) ALL | runmqsc -n
我发现CCDT有两个可能的问题:
IP和开放括号之间的CONNAME
有一个空格。 这可能导致MQ忽略端口1415并使用默认端口1414,它也可能会忽略该空间,这可能不是问题,我从未测试过空间。
COMPMSG(NONE) CONNAME(192.168.1.9 (1415))
CLNTCONN
通道的QMNAME
应该与您在对new MQQueueManager
的调用中指定的名称匹配,因此应该说QM1
不是LocalQM
,这可能是2058
错误的直接原因,但是一旦修复,#1也可能会引起问题#2。
QMNAME(LocalQM) RCVDATA( )
QMNAME还有其他用途,您可以在其中指定组名或空白。 有关此的更多详细信息,请参见我对“ 使用JMS中的CCDT文件连接到IBM MQ ”的回答。 答案与JMS有关,但为setQueueManager
提供的信息将与您对new MQQueueManager
的调用的第一个参数相同。
通常,原因码2058(MQRC_Q_MGR_NAME_ERROR)表示您具有无效的队列管理器名称,或者服务器没有该特定的队列管理器。 检查您输入的队列管理器名称的拼写。 另外,队列管理器名称区分大小写(例如,MQA1与mqa1不同)。
而且,每个队列管理器都将有其自己的端口号。 例如1414、1415、1416等。因此,如果该服务器上正在运行多个队列管理器,请确保您使用的端口正确。
System.Environment.SetEnvironmentVariable("MQCHLLIB", "C:\\ProgramData\\IBM\\MQ\\qmgrs\\QM1\\@ipcc");
System.Environment.SetEnvironmentVariable("MQCHLTAB", "AMQCLCHL.TAB");
在启动程序之前,请尝试设置环境变量,而不要从程序内部进行设置。 我在Windows和/或.NET中发现了在程序中设置环境变量的怪异问题-有时可行,有时却不可行。
最后,您是否将应用程序与队列管理器在同一服务器上运行? 如果是这样,则以“绑定模式”而不是“客户端模式”连接。 绑定模式将更快,因为不涉及网络。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.