在JMS中使用CCDT文件连接到IBM MQ

我正在尝试使用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。知道在CCDT中QMNAME设置了什么以及CLNTCONN您定义了多少个通道以及要完成什么,将有助于弄清楚应该使用来指定什么值setQueueManager


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

setQueueManager("*");


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

setQueueManager("QMGRNAME");


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

setQueueManager("*QMGRGROUPNAME");


上面的另一种变体是,如果文件中有多个CLNTCONN通道,每个通道都QMNAME指定了所有空白(空格)或NULL

,则这称为队列管理器组,这将用于您希望客户端连接到任何数量的不同主机和端口,您无需知道要连接到哪个队列管理器,在这种情况下,您可以将队列管理器名称作为单个空格``或完全不传递’‘:

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

以上是 在JMS中使用CCDT文件连接到IBM MQ 的全部内容, 来源链接: utcz.com/qa/426878.html

回到顶部