2014-11-14 78 views
0

我正在嘗試設置多實例MQ。我配置了NFS並能夠看到活動並使用dspmq -x支持實例。但是我的疑問是在這個設置之後如何進一步進行。多實例MQ設置

  1. 如何配置通道。我得到了CONNAME屬性應該用於此。例如CONNAME(<ip><port>,<ip><port>)。我不知道如何完全做到這一點。

  2. 我需要啓動多少位聽衆。

對於MQ的正常模式,我按照下面的步驟:

1. crtmqm QM 
2. strmqm QM 
3. runmqsc QM 
4. runmqlsr -m QM -t tcp -p 1125 
5. runmqsc QM 
6. define channel(SYSTEM.ADMIN.SVRCONN) chltype(SVRCONN) mcauser('mqm') 

關於多實例MQ,什麼樣的變化我對下面的步驟做。有許多好的文檔可用於設置多實例MQ,但其中大多數僅限於如何使用多實例配置隊列管理器。任何人都可以請指導我進行其餘的步驟。

任何指導,非常感謝。

編輯

感謝沙市莫拉格的指導。

我在兩臺服務器的端口1600上創建了不同的監聽器。我已經創建了以下信道:

DEFINE CHANNEL(MYCHANNEL)CHLTYPE(CLNTCONN)TRPTYPE(TCP) CONNAME( 'IP11600),IP2(1600)')

DEFINE CHANNEL(MYCHANNEL)CHLTYPE( SVRCONN)TRPTYPE(TCP)MCAUSER('')

下面是我用來將消息放入隊列中的獨立java代碼。

public class MutilInstanceMq 
{ 
    public static void main(String[] args) 
    { 
     sendMsg("Test Message"); 
    } 

    public static void sendMsg(String msg) 
    { 
     MQQueueConnectionFactory connectionFactory = null; 
     QueueConnection queueConn = null; 
     QueueSession queueSession = null; 
     QueueSender queueSender = null; 
     TextMessage message = null; 

     try 
     { 
      connectionFactory = new MQQueueConnectionFactory(); 
      connectionFactory.setConnectionNameList("<IP1>(1600), <IP2>(1600)"); 
      connectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT); 
      connectionFactory.setQueueManager("MYQM1"); 
      connectionFactory.setChannel("MYCHANNEL"); 
      queueConn = connectionFactory.createQueueConnection(" ","password"); 
      queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      queueSender = queueSession.createSender(queueSession.createQueue("MYQ")); 
      queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
      message = queueSession.createTextMessage(msg); 
      message.setJMSCorrelationID("12345"); 
      queueSender.send(message);   
      queueConn.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

通過上面的代碼,我在創建連接時以下面的異常結束。

> com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: Failed to 
> connect to queue manager 'MYQM1' with connection mode 'Client' and 
> host name 'IP1(1600),IP2(1600)'. Check the queue manager is 
> started and if running in client mode, check there is a listener 
> running. Please see the linked exception for more information. 

詳細打印堆棧跟蹤是:

com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: Failed to connect to queue manager 'MYQM1' with connection mode 'Client' and host name 'IP1(1600),IP2(1600)'. Check the queue manager is started and if running in client mode, check there is a listener running. Please see the linked exception for more information. 
    at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:608) 
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:236) 
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:440) 
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:7062) 
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:6453) 
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:295) 
    at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6230) 
    at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:144) 
    at MutilInstanceMq.sendMsg(MutilInstanceMq.java:40) 
    at MutilInstanceMq.main(MutilInstanceMq.java:17) 
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2543' ('MQRC_STANDBY_Q_MGR'). 
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:223) 
    ... 8 more 
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2543;AMQ9204: Connection to host 'IP2(1600)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2543;AMQ9487: Remote queue manager is a standby queue manager instance. [3=MYCHANNEL]],3=IP2(1600),5=RemoteConnection.analyseErrorSegment] 
    at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:2010) 
    at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1227) 
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:355) 
    ... 7 more 
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2059;AMQ9204: Connection to host 'IP1(1600)' rejected. [3=IP1(1600)] 
    at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1980) 
    ... 9 more 

在哪裏,我錯了?同時我關閉了通道認證並能夠連接到隊列。

回答

1

要回答你的問題的明確:

  1. 如果你想使用逗號分隔CONNAME方法,那麼你會像這樣結束了。 CONNAME('machine1(1234),machine2(1234)')。兩者都應該有相同的端口號。
  2. 您有兩種選擇。在每臺機器上使用runmqlsr - 因此您在同一端口上有兩個偵聽器。主機上用於連接的目的是能夠連接到隊列管理器。在備用機器上的目的是爲了拒絕那些嘗試在那裏連接的連接,而不是被TCP拒絕,並且沒有監聽者。這也意味着由於連接無法連接而報告的錯誤更爲明確 - 「此計算機是備用計算機」而非「此處沒有TCP偵聽程序」。 備用選項是定義一個LISTENER對象,並讓它由隊列管理器控制,這樣它只會在隊列管理器運行的位置運行。這將配置全部保留在隊列管理器中,但意味着您沒有獲得上述優點。
+0

感謝您的詳細解釋。 – atom 2014-11-15 06:13:30

+0

我已按照上述步驟操作。目前,我在嘗試連接隊列管理器時遇到了'RC = 2059; AMQ9204'。 (請在問題中找到編輯部分) – atom 2014-11-15 09:46:42

+0

明顯的問題是,隊列管理器肯定在IP1(1600)上運行?附:如果您要在您的應用程序中明確編寫連接列表,則不需要定義CLNTCONN,因爲您沒有使用它。 – 2014-11-15 20:17:14