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

2024-02-17

我尝试使用 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)

我正在使用.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设置为多少CLNTCONN您在 CCDT 中定义的通道以及您想要完成的任务将有助于确定应该指定什么值(如果有的话)setQueueManager.


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

setQueueManager("*");

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

setQueueManager("QMGRNAME");

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

setQueueManager("*QMGRGROUPNAME");

上述情况的另一种变化是如果有多个CLNTCONN文件中的通道全部为空白(空格)或 NULLQMNAME指定的,这称为队列管理器组,这将用于您希望客户端连接到任意数量的不同主机和端口的地方,并且您不需要知道您正在连接到哪个队列管理器,在这种情况下,您将将队列管理器名称作为单个空格传递或者什么都没有``:

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

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


如果要查看 CCDT 的内容,可以使用 runmqsc 命令,该命令是 MQ v8 及更高版本客户端或服务器安装的一部分。

对于 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐