Connecting to IBM MQ using CCDT file in JMS

时间:2017-08-30 20:38:47

标签: java jms message-queue ibm-mq

I am trying to connect to IBM MQ using JMS and client channel definition table (CCDT). I was able to connect successfully to the QueueManager when i specify the MQ properties individually. But when i try to use CCDT file i get the below exception.

As client channel definition table (CCDT) is used to determine the channel definitions used by client applications to connect to the queue manager i didnt set QueueManager Name.

\Users\YourUserName\AppData\Local\MonoDevelop-4.0\Cache\TempDownload\

Iam using the this method to set the CCDT URL.

watch:{
  $route: function(value){
    console.log('ROUTE CHANGED');
    console.log(value); /* Route Object */
    console.log(this); /* NOT A VueComponent */
    this.pageTitle = 'Some new title';
  }
},

When i try to connect using below configuration instead of the CCDT file it connects to the MQ.

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)

Do i need to set setQueueManager as well along with the CCDT file , as the exception says .setCCDTURL(ccdt);

2 个答案:

答案 0 :(得分:2)

CCDT不打算在文本编辑器中读取,它是二进制格式的文件。每个CLNTCONN频道的CCDT中的一个参数是QMNAME。了解设置QMNAME的内容以及您在CCDT中定义了多少CLNTCONN个频道以及您想要完成的内容将有助于确定应该使用setQueueManager指定的值。

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

setQueueManager("*");

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

setQueueManager("QMGRNAME");

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

setQueueManager("*QMGRGROUPNAME");

上述的另一个变体是文件中有多个CLNTCONN个通道,每个通道都指定了所有空白(空格)或NULL QMNAME,这称为队列管理器组,这将是您希望客户端连接到任意数量的不同主机和端口的位置,并且您不需要知道要连接到哪个队列管理器,在这种情况下,您将队列管理器名称作为单个空间传递{ {1}}或者什么都没有``:

如果你根本没有使用setQueueManager,那么上面的最后一个用例可能会有用。

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

对于Unix ksh / bash shell,请使用以下命令:

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

对于Windows,请使用以下命令:

export MQCHLLIB=PATH/OF/CCDT
export MQCHLTAB=NAME_OF_CCDT
runmqsc -n

runmqsc程序启动并显示set MQCHLLIB=PATH/OF/CCDT set MQCHLTAB=NAME_OF_CCDT runmqsc -n 后,您可以运行以下命令查看频道详细信息:

Starting local MQSC for 'NAME_OF_CCDT'.

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

DIS CHL(*)

答案 1 :(得分:1)

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

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