首页 > 解决方案 > 发送 jms 通过 ibm mq 通信时出现 NoSuchMethodException

问题描述

我在 Jboss EAP 7 上部署了带有 Spring 的 Java 应用程序我正在尝试与 IBM MQ 通信,因此我部署在版本 9.0.0.1 的 Jboss 资源适配器 wmq.jmsra.rar 上,并在我的 java 项目中添加了依赖项:

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>com.ibm.mq.connector</artifactId>
            <version>9.0.0.1</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>com.ibm.mq.allclient</artifactId>
            <version>9.0.0.1</version>
        </dependency>

我确保这些版本与 allclient 和资源适配器相同。我已经从 ibm 站点下载的 9.0.0.10-IBM-MQ-Install-Java-All 中提取了所需的 allclient jar 和资源适配器。

尝试发送消息时出现以下异常:

Caused by: com.ibm.msg.client.jms.DetailedJMSException: JMSFMQ6312: An exception occurred in the Java(tm) MQI.
jboss_1  | The Java(tm) MQI has thrown an exception describing the problem. 
jboss_1  | See the linked exception for further information.
jboss_1  |  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
jboss_1  |  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
jboss_1  |  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
jboss_1  |  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:226)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.wmq.factories.WMQXAConnectionFactory.createV7ProviderConnection(WMQXAConnectionFactory.java:172)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7809)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.wmq.factories.WMQXAConnectionFactory.createProviderXAConnection(WMQXAConnectionFactory.java:98)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createXAConnectionInternal(JmsConnectionFactoryImpl.java:350)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.mq.jms.MQXAConnectionFactory.createXAConnection(MQXAConnectionFactory.java:131)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.mq.connector.ConnectionBuilder.createConnection(ConnectionBuilder.java:134)
jboss_1  |  ... 63 more
jboss_1  | Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2195;AMQ9546: Error return code received. [1=java.lang.NoSuchMethodException[com.ibm.mq.jmqi.remote.api.RemoteFAP.<init>(com.ibm.mq.jmqi.JmqiEnvironment, int)],3=Class.getConstructor0]
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.mq.jmqi.JmqiEnvironment.getInstance(JmqiEnvironment.java:793)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.mq.jmqi.JmqiEnvironment.getMQI(JmqiEnvironment.java:638)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.msg.client.wmq.factories.WMQXAConnectionFactory.createV7ProviderConnection(WMQXAConnectionFactory.java:164)
jboss_1  |  ... 68 more
jboss_1  | Caused by: java.lang.NoSuchMethodException: com.ibm.mq.jmqi.remote.api.RemoteFAP.<init>(com.ibm.mq.jmqi.JmqiEnvironment, int)
jboss_1  |  at java.base/java.lang.Class.getConstructor0(Class.java:3349)
jboss_1  |  at java.base/java.lang.Class.getConstructor(Class.java:2151)
jboss_1  |  at deployment.wmq.jmsra.rar//com.ibm.mq.jmqi.JmqiEnvironment.getInstance(JmqiEnvironment.java:700)
jboss_1  |  ... 70 more

我已确保资源适配器具有此特定方法。我还能检查什么?

标签: javaspringjbosswebsphereibm-mq

解决方案


这看起来像你有两个版本的同一个类,一个有这个方法,另一个没有,因此它在运行时失败,因为它选择了错误的类版本。

要解决这个问题,您可以在 jboss 中将类加载更改为详细。

  1. cd <JBOSS_HOME>\bin\ 目录。

  2. 打开 $JBOSS_HOME/bin/standalone.conf

  3. (bat 或 sh 文件)在文本编辑器中找到设置 JAVA_OPTS 的行(其中有几个),将 -verbose:class 添加到其中的任何一个。示例(Windows)设置“JAVA_OPTS=%JAVA_OPTS% -XX:+TraceClassLoading -verbose:class”​</p>

  4. 保存文件。重新启动 JBoss 应用程序。

  5. 现在您在服务器日志中搜索此类。查看是否有多个条目并找到包含相同条目的 jar。

  6. 确定您需要的一个并删除另一个。


推荐阅读