2017-08-12 175 views
1

我已经为IBM MQ设置了JMS侦听器。当侦听器在本地机器上运行在像Tomcat这样的单个JVM上时,它运行良好。但是,当我将它部署到有2个虚拟机的云时,它在其中一个虚拟机上运行良好,并连接到MQ,但在另一个虚拟机上说下面。在JVM集群中使用JMS的IBM MQ侦听器

对于使用来自多个客户端的ID,密码以连接到队列管理器的IBM MQ,是否存在任何限制?

RROR> com.ssc.ach.mq.JMSMQReceiver[main]: errorMQJMS2013: invalid security authentication supplied for MQQueueManager 
javax.jms.JMSSecurityException: MQJMS2013: invalid security authentication supplied for MQQueueManager 
    at com.ibm.mq.jms.MQConnection.createQM(MQConnection.java:2050) 
    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:185) 
    at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:1066) 
    at 

我使用Servlet的init方法

public void init(ServletConfig config) throws ServletException { 
     logger.info("App Init"); 
     try { 
      boolean isListnerOn = Boolean.parseBoolean(System.getProperty("listner", "false")); 
      logger.info(" startReceiver , listner flag is "+isListnerOn); 
      if(isListnerOn){ 
       if (mqReceive == null) { 
        MyMessageListener jmsListner = new MyMessageListener(); 
        mqReceive = new JMSMQReceiver(jmsListner); 
       } 
       if (mqReceive != null) { 
        try{ 
         mqReceive.start(); 
        } catch (Exception e) { 
         logger.error("Error starting the listner ", e); 
        } 

       } 
      }else{ 
       logger.info(" listner not started as flag is "+isListnerOn); 
      } 

     } catch (Exception e) { 
      logger.error(e, e); 
     } 
    } 


private MQQueueConnectionFactory mqQueueConnectionFactory; 



    public MQReceiver(MyMessageListener listner) { 
     userName=System.getProperty("mqId",""); 
     pwd=System.getProperty("mqId",""); 
     host = System.getProperty(PREFIX + ".host"); 
     port = Integer.parseInt(System.getProperty(PREFIX + ".port")); 
     qManager = System.getProperty(PREFIX + ".qManager"); 
     channel = System.getProperty(PREFIX + ".channel"); 
     queueName = System.getProperty(PREFIX + ".achqueueName"); 
     logger.info("HOST:" + host + "\tPORT:" + port + "\tqManager:"+ qManager + "\tchannel:" + channel + "\tqueueName:"+ queueName); 
     try { 

     mqQueueConnectionFactory = new MQQueueConnectionFactory(); 
     mqQueueConnectionFactory.setHostName(host); 
     mqQueueConnectionFactory.setChannel(channel);//communications link 
     mqQueueConnectionFactory.setPort(port); 
     mqQueueConnectionFactory.setQueueManager(qManager);//service provider 
     mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); 
     queueConnection = mqQueueConnectionFactory.createConnection(trustUserName, trustID); 
     session = queueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     queue = session.createQueue(queueName); 
     ((MQDestination) queue).setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ); 
     MessageConsumer consumer = session.createConsumer(queue); 
      consumer.setMessageListener(listner); 
     logger.info(" Connect MQ successfully."); 

     } catch (JMSException e) { 
       logger.error("error" + e.getMessage(), e); 
      } 
    } 

    public void start() { 
     logger.info("Starting MQListener... "); 
     //mqListener.start(); 
     try { 
      queueConnection.start(); 
      logger.info("MQListener start successfully"); 
     } catch (JMSException e) { 
       logger.error("error" + e.getMessage(), e); 
     } 

    } 
+0

我需要问MQ管理团队来检查日志和pam_tally 设置。我们正在使用MQ 8. – Nayeem

+0

两个虚拟机启动之间存在1秒的微小延迟。我们无法控制他们在云中的行为,并且负责启动。但它很快就会给认证错误吗?当相同的代码在其他虚拟机上工作时。 – Nayeem

回答

1

JMS客户机错误JMSWMQ2013的IBM MQ类可能会导致很多问题。

IBM Support Technote“WMQ 7.1/7.5/8.0/9.0 queue manager RC 2035 MQRC_NOT_AUTHORIZED or AMQ4036 or JMSWMQ2013 when using client connection as an MQ Administrator”在诊断和解决类似问题方面有很好的写作。

如果您需要更具体的帮助,请首先编辑并将它们添加到您的问题中,以提供以下详细信息。

  1. 客户端应用程序使用的JMS的IBM MQ类的版本。安装在IBM MQ队列管理器
  2. 版本的IBM MQ的
  3. 错误的队列管理器的AMQERR01.LOG这种情况发生在同一时间,因为你在IBM MQ类为第二VM JMS客户端应用程序收到错误。 。

奇怪的是,它可以在第一VM和失败,在第二。如果两个VM的trustUserName,trustID相同,则IBM MQ应平等接受它们。

如果您使用的是IBM MQ v8或更高版本的本机连接身份验证,则操作系统或PAM可能会拒绝第二个连接。我只看到了pam_tally有5个连接并且同时连接5个以上的情况。有可能每个用户有一次登录的登录限制。


每你对此有何评论看来,你有一个CHLAUTH ADDRESSMAP规则缺失,第一个虚拟机的IP被允许和第二虚拟机的IP是不允许的。根据队列管理器的配置方式以及CHLAUTH规则如何阻止连接,队列管理器可以将MQRC 2035返回给客户端。在用于JMS客户机的IBM MQ类上,这将作为MQJMS2013返回。例如,如果您的队列管理器正在使用ADOPTCTX(NO)并且具有将ADDRESS(*)映射到MCAUSER(不存在)(例如:*NOACCESS)以及其他映射从特定IP到具有访问权限的用户的CHLAUTH规则的CHLAUTH规则,则可能会发生这种情况。

更安全的设置是使用ADOPTCTX(YES),它会告诉MQ将MCAUSER设置为由CONNAUTH进行身份验证的ID。您还可以使用ADDRESS(*) USERSRC(NOACCESS)默认阻止的ADDRESSMAP规则,然后使用特定IP和USERSRC(CHANNEL的其他规则阻止允许您希望列入白名单的IP。

+0

是的,在使用JMS时接收MQJMS2013会导致误导,因为IBM本机API会给出有意义的错误。与主机的连接被拒绝。 – Nayeem

1
com.ssc.ach.mq.JMSMQReceiver[main]: errorMQJMS2013: invalid security authentication supplied for MQQueueManager 
javax.jms.JMSSecurityException: MQJMS2013: invalid security authentication supplied for MQQueueManager 

开始在VM启动监听器是因为:

queueConnection = mqQueueConnectionFactory.createConnection(trustUserName, trustID); 

如果不提供一个有效的用户名和密码可以由队列管理器进行身份验证,然后您的连接将被拒绝。我不知道你传递给该方法的内容,但它应该是远程系统的有效UserId和密码。

此外,我希望人们会停止使用术语'MQ Listener',因为您没有创建'MQ Listener',您正在创建一个正在接收消息的客户。

MQ监听器是接受和处理传入连接的MQ组件。见here

+0

如果两个虚拟机上都运行相同的代码,为什么它能够连接到一个虚拟机并在其他虚拟机上发出验证错误?两者都收到相同的用户名和密码。我已将它们印在连接上方,我可以看到它是正确的。由于错误显然表明它无法验证,即使IAM传递正确的细节。 – Nayeem

+1

奇怪的是,IP不在ACL上,并且错误提示为MQQueueManager提供了无效的安全认证。在添加了可以连接的IP地址之后。相同的代码..没有变化! – Nayeem

+0

是的,IP地址失败的CHLAUTH规则会导致安全失败。 – Roger