2017-08-12 174 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