3

配置 MQ 连接工厂后出现以下错误。

java.lang.ClassCastException:com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle 与 com.ibm.mq.jms.MQQueueConnectionFactory 不兼容

我的代码片段异常指向:

字符串 queueConnectionJndi = props.getProperty(queueConnection + MQ_CONN); queueConnectionFactory = MQQueueConnectionFactory)initialContext.lookup(queueConnectionJndi);

我无法找出造成这种情况的根本原因。

任何人都可以帮助我,在此先感谢。

4

5 回答 5

1

没有更多上下文就无法确定,但看起来像这个方法调用:

initialContext.lookup(queueConnectionJndi);

正在返回 com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle 类型的对象,该对象无法转换为 com.ibm.mq.jms.MQQueueConnectionFactory。

你能提供更多的上下文吗?

于 2012-09-21T12:04:12.567 回答
0

这篇关于旧 nabble 的帖子听起来像是一个类似的问题,可能会对您有所帮助。

具体来说,最终响应谈到删除jms.jar可能在您部署的 WAR 中的任何文件。检查您的WEB-INF/lib. 某些 jar 由 Websphre 容器提供,不应将它们包含在您的 WAR 中。

Spring Fourm 上的这篇文章还指出了由不应存在的类路径中包含的 jar 引起的这种性质的问题

如果您发现以下任何内容,请删除它们...

naming.jar
providerutil.jar
jndi.jar
jms.jar
mq.jar
websphere.jar
于 2012-09-21T13:08:07.953 回答
0

WAS 使用的 MQ jar 和我的应用程序使用的不同,所以出现了这个问题。当我更正类路径时,它已解决。很抱歉给您带来麻烦,感谢您的帮助。

于 2012-10-09T06:55:18.347 回答
0

您能否重写代码以使用 JMS 标准(ConnectionFactoryQueueConnectionFactory)而不是 Websphere MQ 特定的实现类?这样您就不会将您的应用程序绑定到 Websphere MQ 并将其移植到替代 MQ 实现会更容易......

IE

import javax.jms.QueueConnectionFactory;
...

queueConnectionFactory = (QueueConnectionFactory)initialContext.lookup(jndiName);
于 2012-09-25T22:34:36.133 回答
0

我经历了很多反复试验才能找到答案(至少是我问题的答案)。我希望这个解决方案也能解决你的问题。正如另一篇文章中提到的,不包括 jms 库作品。但是如何排除 jms 库并且仍然能够编译代码呢?那是一件似乎没有人提到过的事情。解决方案是将 jms 库的范围设置为“提供”(如果您使用的是 Maven 或 Gradle)。

如某处所述:

“已提供意味着您需要 JAR 进行编译,但在运行时环境已经提供了一个 JAR,因此您不需要将它与您的应用程序一起打包。对于 Web 应用程序,这意味着 JAR 文件不会被放到WEB-INF/lib目录下。”

所以在你的 pom.xml 添加/更新这些:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>4.3.4.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>javax.jms</groupId>
            <artifactId>javax.jms-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>javax.jms</groupId>
    <artifactId>jms</artifactId>
    <version>1.1</version>
    <scope>provided</scope>
</dependency>

希望这对那些因缺乏互联网答案而感到沮丧的人有所帮助。

删除所有 ibm 库。他们没用。一旦你部署到 Websphere 上,它无论如何都会使用它的库。

于 2016-11-29T21:17:50.733 回答