2017-08-30 146 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