Java 在JVM集群中使用JMS的IBM MQ侦听器

Java 在JVM集群中使用JMS的IBM MQ侦听器,java,jms,ibm-mq,Java,Jms,Ibm Mq,我已经为IBM MQ设置了JMS侦听器。当侦听器在单个JVM上运行时,如本地机器上的tomcat,它运行良好。但是,当我将它部署到有两个VM的云中时,它在其中一个VM上运行良好,并连接到MQ,但在另一个VM上它在下面说明 IBM MQ是否对使用来自多个客户端的ID、密码来连接到队列管理器有任何限制 RROR> com.ssc.ach.mq.JMSMQReceiver[main]: errorMQJMS2013: invalid security authentication supplie

我已经为IBM MQ设置了JMS侦听器。当侦听器在单个JVM上运行时,如本地机器上的tomcat,它运行良好。但是,当我将它部署到有两个VM的云中时,它在其中一个VM上运行良好,并连接到MQ,但在另一个VM上它在下面说明

IBM MQ是否对使用来自多个客户端的ID、密码来连接到队列管理器有任何限制

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
原因是:

queueConnection = mqQueueConnectionFactory.createConnection(trustUserName, trustID);
如果您没有提供可由队列管理器验证的有效用户ID和密码,则您的连接将被拒绝。我不知道您要传递给该方法的是什么,但它应该是远程系统的有效用户ID和密码

此外,我希望人们停止使用术语“MQ侦听器”,因为您不是在创建“MQ侦听器”,而是在创建一个正在接收消息的消费者


MQ侦听器是MQ的一个组件,它接受并处理传入的连接。请参阅。

IBM MQ类for JMS客户端错误
JMSWMQ2013
可能由许多问题引起

IBM Support Technote“”对诊断和解决此类问题有很好的描述

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

  • 客户端应用程序使用的IBM MQ JMS类的版本
  • IBM MQ队列管理器上安装的IBM MQ版本
  • 队列管理器的AMQERR01.LOG中的错误与您在第二个VM上的IBM MQ Classes for JMS客户端应用程序中收到的错误同时发生

  • 奇怪的是,它在第一个VM上工作,在第二个VM上失败。如果两个虚拟机的trustUserName、trustID相同,IBM MQ应该平等地接受它们

    如果您使用的是IBM MQ v8或更高版本的本机连接身份验证,则操作系统或PAM可能拒绝第二个连接。我只看到pam_tally限制了5次,同时超过了5次连接命中。可能存在某种登录限制,每个用户只能登录一次


    根据您的评论,您似乎缺少CHLAUTH ADDRESSMAP规则,第一个VM的IP是允许的,第二个VM的IP是不允许的。根据队列管理器的配置方式以及CHLAUTH规则阻止连接的方式,队列管理器可能会将MQRC 2035返回给客户端。在IBM MQ Classes for JMS客户机上,这将作为MQJMS2013返回。例如,如果您的队列管理器正在使用
    采用CTX(否)
    ,并且具有将
    地址(*)
    映射到不存在的
    MCAUSER
    (例如:
    *NOACCESS
    )的CHLAUTH规则以及将连接从特定IP映射到具有访问权限的用户的其他CHLAUTH规则,则可能发生这种情况


    更安全的设置是使用
    ADOPTCTX(YES)
    ,这将告诉MQ将
    MCAUSER
    设置为CONNAUTH验证的id。默认情况下,您还可以使用带有
    ADDRESS(*)USERSRC(NOACCESS)
    的ADDRESSMAP规则进行阻止,然后使用带有特定IP和
    USERSRC的其他规则进行阻止(CHANNEL
    允许您想将这些IP列入白名单。

    如果两个VM上都运行相同的代码,为什么它能够在一个VM上连接并在另一个VM上给出身份验证错误?两个VM都接收相同的用户名和密码。我已将它们打印在连接上方,我可以看到它是正确的。因为错误清楚地说明了其原因即使iam传递正确的详细信息,也无法进行身份验证。奇怪的是,.IP不在ACL上,错误是为MQQueueManager提供了无效的安全身份验证。添加IP地址后,它可以连接。相同的代码。.没有更改!是的,IP地址未通过CHLAUTH规则将导致安全失败。我需要让MQ管理团队检查日志和pam_-taly设置。我们正在使用MQ 8。两个VM的启动之间有1秒的微小延迟。我们无法控制他们的行为,因为他们在云端,它负责启动。但它不应该给出身份验证错误,对吗?当相同的代码在其他VM上工作时。是的,是ki使用JMS时接收MQJMS2013的错误,其中IBM本机API给出了有意义的错误。与主机的连接被拒绝。
    com.ssc.ach.mq.JMSMQReceiver[main]: errorMQJMS2013: invalid security authentication supplied for MQQueueManager
    javax.jms.JMSSecurityException: MQJMS2013: invalid security authentication supplied for MQQueueManager
    
    queueConnection = mqQueueConnectionFactory.createConnection(trustUserName, trustID);