![](/img/trans.png)
[英]Load balancing issue while connecting to IBM MQ using JMS + CCDT file
[英]Connecting to IBM MQ using CCDT file in JMS
我正在嘗試使用 JMS 和客戶端通道定義表 (CCDT) 連接到 IBM MQ。 當我單獨指定 MQ 屬性時,我能夠成功連接到 QueueManager。 但是當我嘗試使用 CCDT 文件時,出現以下異常。
由於客戶端通道定義表 (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)
我正在使用.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 不打算在文本編輯器中讀取,它是一個二進制格式的文件。 每個CLNTCONN
通道的 CCDT 中的參數之一是QMNAME
。 了解QMNAME
設置為什么以及您在 CCDT 中定義了多少個CLNTCONN
通道以及您想要完成什么將有助於確定應該為setQueueManager
指定什么值(如果有的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 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
我有一段時間沒有看它,但我認為正確的格式是:
MQQueueConnectionFactory qcf = new MQQueueConnectionFactory();
qcf.setQueueManager(qManager);
qcf.setCCDTURL(ccdt);
conn = qcf.createConnection(username, pwd);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.