多实例MQ设置

时间:2014-11-14 13:33:30

标签: ibm-mq

我正在尝试设置Multi Instance MQ。我已经配置了NFS,并且能够使用dspmq -x查看活动和备用实例。但是我怀疑在这个设置之后如何继续进行。

  1. 如何配置频道。我应该使用CONNAME属性。例如CONNAME(<ip><port>,<ip><port>)。我不知道该怎么做。

  2. 我需要启动多少个听众。

  3. 对于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设置的好文档,但其中大多数仅限于如何使用多实例配置队列管理器。请有人指导我完成剩下的步骤。

    非常感谢任何指导。

    修改

    感谢Shashi和Morag的指导。

    我在两台服务器上的端口1600上创建了不同的侦听器。我创建了以下频道:

      

    DEFINE CHANNEL(MYCHANNEL)CHLTYPE(CLNTCONN)TRPTYPE(TCP)   CONNAME(&#39; IP11600),IP2(1600)&#39)

         

    DEFINE CHANNEL(MYCHANNEL)CHLTYPE(SVRCONN)TRPTYPE(TCP)MCAUSER(&#39;&#39;)

    下面是我用来将消息放入队列的独立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
    

    我哪里错了?同时我关闭了通道验证并能够连接到队列。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

回答你的明确问题:

  1. 如果您想使用以逗号分隔的CONNAME方法,那么您最终会得到类似的结果。 CONNAME('machine1(1234),machine2(1234)')。您应该在两者中都有相同的端口号。
  2. 这里有两种选择。在每台机器上使用runmqlsr - 所以你在同一个端口上有两个监听器。主计算机上的目的是使连接能够连接到队列管理器。备用计算机上的连接的目的是拒绝尝试连接到那里的连接,而不是被TCP拒绝的连接,因为没有监听器。它还意味着连接报告的错误,因为它无法连接的原因更明确 - “这台机器是备用的”而不是“没有TCP侦听器”。 备用选项是定义LISTENER对象并让它由队列管理器控制,这样它只会在队列管理器运行的地方运行。这使得配置全部保留在队列管理器中,但确实意味着您无法获得上述优势。