我的应用程序使用带有以下驱动程序的MQ 7 - com.ibm.mq.jms
,com.ibm.mq.jmqi
和com.ibm.mq.pcf
- 版本7.0.1.6。我们最近升级到MQ 9,因此我用com.ibm.mq.allclient
,com.ibm.mq.traceControl
(版本9.0.0.0-p900-L160512.4)和javax-jms-api-2.0.1
替换了驱动程序(必须包含此JAR,因为它为JMSRuntimeException类提供了一个错误,它是这个JAR的一部分。现在,当我运行已升级的驱动程序尝试连接到MQ 9服务器的应用程序时,我收到以下错误。当我用以前的驱动程序替换驱动程序时,应用程序正在按预期工作。
有人可以告诉我,我用来连接MQ 9的驱动程序是否正确?我错过了其他任何JAR文件吗?或者是否有其他原因导致以下错误?
Exception in thread "main" {_name=com.epo.core.SystemException, com.ibm.msg.client.jms.DetailedJMSSecurityException=com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'queue' with connection mode 'Client' and host name 'Hostname(port)'.
Please check if the supplied username and password are correct on the QueueManager to which you are connecting.
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:531)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:422)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7913)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:299)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:236)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6024)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:111)
. . .
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)
... 14 more
}
答案 0 :(得分:0)
正如@JoshMc在他的评论中建议的那样,您需要查看队列管理器错误日志(AMQERR01.log文件),因为队列管理器可能正在将MQRC_NOT_AUTHORIZED(2035)原因代码返回给应用程序。您可以在应用程序收到的链接异常中确认这一点。
考虑到您列出的版本,一种可能性是客户端现在在连接尝试期间将用户标识符流向队列管理器,以便在客户端库升级之后进行身份验证,而不是之前的。
在MQ v7.0.1.x Java / JMS客户端中,可以不指定用户名,因此Java / JMS客户端不会将其传递给队列管理器。当通过TCP / IP(CLIENT传输)连接服务器连接通道没有设置MCAUSER时,来自应用程序的连接将采用通道进程运行的用户“mqm”,并且这将被授权连接 - 所以没有2035。
从MQ V7.1开始,Java / JMS客户端将不将空白用户标识符传递给队列管理器。如果应用程序未指定用户标识符,则在连接请求期间,Java系统属性“user.name”(即,为应用程序启动JVM的用户)的值将流入队列管理器。如果未在队列管理器上授予此用户必要的权限,则将使用2035原因代码拒绝连接请求。队列管理器错误日志可能会报告哪些用户ID未能获得授权。
以下技术说明从WebShere Application Server的角度讨论了这一点,但对于独立的Java SE应用程序也是如此: