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

Connecting to IBM MQ using CCDT file in JMS

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

由于客户端通道定义 table (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 ''

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

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

CCDT 不能在文本编辑器中阅读,它是二进制格式的文件。每个 CLNTCONN 通道的 CCDT 参数之一是 QMNAME。了解 QMNAME 的设置以及您在 CCDT 中定义了多少 CLNTCONN 通道以及您想要完成的任务将有助于确定应该为 setQueueManager 指定什么值(如果有的话)。


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

setQueueManager("*");

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

setQueueManager("QMGRNAME");

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

为前缀的队列管理器组名称
setQueueManager("*QMGRGROUPNAME");

上述的另一种变体是,如果文件中有多个 CLNTCONN 通道,每个通道都指定了全空白 (spaces) 或 NULL QMNAME,这是称为队列管理器组,这将用于您希望客户端连接到任意数量的不同主机和端口并且您不需要知道您连接到哪个队列管理器的地方,在这种情况下您将传递队列管理器命名为单个 space </code> 或什么都没有 ``: </p> <pre><code>setQueueManager(" "); //or setQueueManager("");

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


如果要查看 CCDT 的内容,可以使用作为 MQ v8 和更高版本客户端或服务器安装的一部分的 运行mqsc 命令。

对于 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

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

DIS CHL(*)

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

DIS CHL(*) QMNAME CONNAME