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



我正在尝试使用JMS和客户端频道定义表(CCDT)连接到IBM MQ。当我单独指定MQ属性时,我能够成功连接到QueueManager。但是,当我尝试使用CCDT文件时,我会得到以下异常。

作为客户端频道定义表(CCDT),用于确定客户端应用程序使用以连接到队列管理器的频道定义。

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);

我还需要与CCDT文件一起设置setqueemanager

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


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

setQueueManager("*");

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

setQueueManager("QMGRNAME");

如果文件中有多个CLNTCONN频道,每个频道都有相同的QMNAME指定的,该名称并不是要反映与每个频道关联的主机和端口上的实际队列管理器名称,则称为队列经理组,这将是您希望客户端连接到任意数量不同主机和端口的位置,并且您不需要知道您要连接到哪个队列管理器,在这种情况下,您将通过PEARE MALARE组名称。*

setQueueManager("*QMGRGROUPNAME");

上述另一个变体是,如果文件中有多个CLNTCONN通道,则指定了所有空白(空格)或NULL QMNAME,则称为队列管理器组,这将是您想要的。客户端可以连接到任意数量的不同主机和端口,您不需要知道要连接到哪个队列管理器,在这种情况下,您将将Queue Manager名称作为单个空格或无需``'':

setQueueManager(" ");
//or
setQueueManager("");

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


如果要查看CCDT的内容,则可以使用作为MQ V8的一部分以及更高的客户端或服务器安装的RunMQSC命令。

对于Unix ksh/bash shells使用以下内容:

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程序启动并显示了CC_17,您可以运行以下命令以查看频道详细信息:

DIS CHL(*)

以下是一个更具体的命令,用于缩小返回的字段数:

DIS CHL(*) QMNAME CONNAME

我一段时间没有看它,但我认为正确的格式是:

MQQueueConnectionFactory qcf = new MQQueueConnectionFactory();
qcf.setQueueManager(qManager);
qcf.setCCDTURL(ccdt);
conn = qcf.createConnection(username, pwd);

最新更新