我正在尝试使用JMS和客户机通道定义表(CCDT)连接到IBM MQ。当我分别指定MQ属性时,我能够成功连接到QueueManager。
但是,当我尝试使用CCDT文件时,出现以下异常。

由于客户端通道定义表(CCDT)用于确定客户端应用程序用来连接到队列管理器的通道定义,因此我没有设置QueueManager名称。

ERROR> com.ssc.ach.mq.JMSMQReceiver[main]: errorMQJMS2005: failed to create MQQueueManager for ''
javax.jms.JMSException: MQJMS2005: failed to create MQQueueManager for ''
    at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:586)
    at com.ibm.mq.jms.MQConnection.createQM(MQConnection.java:2110)
    at com.ibm.mq.jms.MQConnection.createQMNonXA(MQConnection.java:1532)
    at com.ibm.mq.jms.MQQueueConnection.<init>(MQQueueConnection.java:150)
    at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:174)
    at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:1066)

Iam使用.setCCDTURL(ccdt);方法设置CCDT URL。
private MQQueueConnectionFactory  mqQueueConnectionFactory = new MQQueueConnectionFactory();
         mqQueueConnectionFactory.setCCDTURL(ccdt);
         queueConnection = mqQueueConnectionFactory.createConnection(username, pwd);

当我尝试使用以下配置而不是CCDT文件进行连接时,它将连接到MQ。
         mqQueueConnectionFactory.setHostName(host);
         mqQueueConnectionFactory.setChannel(channel);
         mqQueueConnectionFactory.setPort(port);
         mqQueueConnectionFactory.setQueueManager(qManager);
         mqQueueConnectionFactory.setTransportType(1);

我是否需要同时设置setQueueManager和CCDT文件,因为异常显示failed to create MQQueueManager for ''

最佳答案

CCDT不能在文本编辑器中读取,它是二进制格式的文件。 CCDT中每个CLNTCONN通道的参数之一是QMNAME。知道将QMNAME设置为什么以及您在CCDT中定义了多少个CLNTCONN通道以及要完成的操作,将有助于找出setQueueManager是否指定了什么值。

如果只有一个CLNTCONN通道,则可以指定以下内容,无论QMNAME属性设置为什么,它都将使用单个通道进行连接:

setQueueManager("*");

如果文件中有一个以上的CLNTCONN通道,并且每个通道都指定了不同的QMNAME,则假设该名称与侦听与该通道关联的主机和端口上的实际队列管理器名称匹配,您将传递队列管理器名称:
setQueueManager("QMGRNAME");

如果文件中有不止一个CLNTCONN通道,每个通道都指定了相同的QMNAME,但该名称并不意味着反映监听每个通道相关主机和端口的实际队列管理器名称,则称为队列管理器组,这将用于您希望客户端连接到任意数量的不同主机和端口并且不需要知道要连接到哪个队列管理器的情况,在这种情况下,您将传递以*开头的队列管理器组名:
setQueueManager("*QMGRGROUPNAME");

上面的另一种变化是,如果文件中有多个CLNTCONN通道,每个通道都指定了所有空白(空格)或NULL QMNAME,这称为队列管理器组,这将用于您希望客户端连接的位置到任意数量的不同主机和端口,并且您无需知道要连接到哪个队列管理器,在这种情况下,您可以将队列管理器名称作为单个空格传递或完全不传递'':
setQueueManager(" ");
//or
setQueueManager("");

如果您根本不使用setQueueManager,则上面的最后一个用例可能会起作用。

如果要查看CCDT的内容,可以使用MQ v8和更高版本的客户机或服务器安装中附带的runmqsc命令。

对于Unix ksh / bash shell,请使用以下命令:
export MQCHLLIB=PATH/OF/CCDT
export MQCHLTAB=NAME_OF_CCDT
runmqsc -n

对于Windows,请使用以下命令:
set MQCHLLIB=PATH/OF/CCDT
set MQCHLTAB=NAME_OF_CCDT
runmqsc -n

一旦runmqsc程序启动并显示Starting local MQSC for 'NAME_OF_CCDT'.,您可以运行以下命令以查看通道详细信息:
DIS CHL(*)

下面是更具体的命令,用于缩小返回的字段数:
DIS CHL(*) QMNAME CONNAME

关于java - 在JMS中使用CCDT文件连接到IBM MQ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45969323/

10-09 00:41