2017-08-30 205 views
1

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

由于客户端通道定义表(CCDT)用于确定客户端应用程序用于连接到队列管理器的通道定义,因此我没有设置QueueManager Name。

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 ''

+0

您在通道表中定义的CLNTCONN通道的'QMNAME'字段中有什么?你在频道表中只定义了一个频道吗? – JoshMc

+0

在TAB文件中,我看到加密的数据和主机名,端口号,通道名称 – Nayeem

+0

你安装了什么版本的mq客户端? – JoshMc

回答

2

CCDT并不意味着在文本编辑器中读取,它是一个二进制格式的文件。每个CLNTCONN频道的CCDT中的参数之一是QMNAME。知道QMNAME设置为什么,以及您在CCDT中定义了多少个CLNTCONN通道,以及您想要完成的操作将有助于确定应使用setQueueManager指定哪些值。


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

setQueueManager("*"); 

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

setQueueManager("QMGRNAME"); 

如果存在该文件在一个以上的CLNTCONN通道各自与指定的相同QMNAME其中该名称并不意味着以反映实际的队列管理器名称侦听与每个通道相关联的主机和端口上,这被称为队列管理器组,这将用于希望客户端连接到任意数量的不同主机和端口的位置,并且您不需要知道连接到哪个队列管理器,在这种情况下,您将通过队列管理器组名称的前缀为*

setQueueManager("*QMGRGROUPNAME"); 

的上述另一种变型,如果有文件中的一个以上的CLNTCONN通道,每个通道与所有空白(空格)或指定的NULL QMNAME,这被称为一个队列管理器组,这将被预期,其中您希望客户端连接到任意数量的不同主机和端口,并且不需要知道要连接到哪个队列管理器,在这种情况下,您可以将队列管理器名称作为单个空间或根本没有任何内容` `:

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

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


如果你想查看CCDT的内容,你可以使用当属MQ V8的一部分和较高的客户端或服务器安装runmqsc命令。

对于Unix的ksh/bash的外壳使用以下命令:

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(*) 

下面是更多speci fic命令来缩小返回的字段数:

DIS CHL(*) QMNAME CONNAME 
+0

是的,我试着添加mqQueueConnectionFactory.setQueueManager(“* QUEMANAGER”)它现在的工作。 – Nayeem

+1

@Nayeem我添加了关于如何使用MQ v8或更高版本的'runmqsc'命令作为客户端和服务器安装的一部分来查看CCDT中的CLNTCONN通道定义的信息,这将允许您查看定义了多少个通道在表中并且如果需要也更新它('ALTER CHL','DEFINE CHL','DELETE CHL')。 – JoshMc

+0

我实际上在尝试添加mqQueueConnectionFactory.setQueueManager(“* QUEMANAGER”)之前,看到你的答案和它的工作。但你的回答对我发布的问题有很好的解释。 – Nayeem

1

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

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

是的,我试着添加mqQueueConnectionFactory.setQueueManager(“* QUEMANAGER”)它现在的工作。 – Nayeem

+0

好 - 请接受我的回答。 – Roger