2014-11-14 217 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