Somnath Musib
Somnath Musib

Reputation: 3724

Multi Instance MQ set up

I am trying to set up Multi Instance MQ. I have configured NFS and able to see the active and stand by instances using dspmq -x. However my doubt is after this setup how to proceed further.

  1. How can I configure the channel(s). I got CONNAME property should be use for this. e.g. CONNAME(<ip><port>,<ip><port>). I am not aware how to do it exactly.

  2. How many listeners I need to start.

For normal mode of MQ, I follow the below steps:

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

For multi-instance MQ, what changes I have to do for the below steps. There are many good documents available for Multi Instance MQ set up, but most of these are limited to how to configure the queue manager with multi-instance. Could anybody please guide me for the remaining steps.

Any guidance is much appreciated.

EDIT

Thanks Shashi and Morag for the guidance.

I have created different listeners on port 1600 in both the servers. I have created the below channel:

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

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

Below is the stand alone java code I am using to put a message in queue.

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();
         }
     }  
}

With the above code I end up with the below exception while creating the connection.

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

Detailed Print stack trace is:

    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

Where I am going wrong? Meanwhile I have turned off channel authentication and able to connect to the queue.

Upvotes: 1

Views: 4135

Answers (2)

Morag Hughson
Morag Hughson

Reputation: 7619

To answer your explicit questions:

  1. If you want to use the comma-separated CONNAME method, then you'll end up with something like this. CONNAME('machine1(1234),machine2(1234)'). You should have the same port number in both.
  2. You have two options here. Either use runmqlsr on each machine - so you have two listeners, on the same port. The purpose of the one on the primary machine is for connections to be able to connect to the queue manager. The purpose of the one on the standby machine is to reject connections which try to connect there more quickly than they could be rejected by TCP working out that there is no listener. It also means that the error reported by the connection for the reason it could not connect is much more explicit - "This machine is the standby" rather than "no TCP listener here". The alternate option is to define a LISTENER object and have it controlled by the queue manager, this way it will only run where the queue manager runs. This keeps the configuration all within the queue manager, but does mean you don't get the benefits outlined above.

Upvotes: 2

Shashi
Shashi

Reputation: 15283

The steps are well documented in Knowledge Center here: http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.1.0/com.ibm.mq.doc/fa70161_.htm?lang=en. How to verify the multi-instance setup is described here: http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.1.0/com.ibm.mq.doc/fa70163_.htm?lang=en.

Upvotes: 2

Related Questions