WebSphere MQ 配置问题

Posted

技术标签:

【中文标题】WebSphere MQ 配置问题【英文标题】:WebSphere MQ Configuration issues 【发布时间】:2012-09-06 09:54:37 【问题描述】:

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

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

我的代码 sn-p 异常指向:

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

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

任何人都可以帮我解决这个问题,在此先感谢。

【问题讨论】:

这个链接有帮助吗:www-01.ibm.com/support/docview.wss?uid=swg21238470 @Shashi :我也尝试过使用这种方式,但我还是遇到了同样的错误。 【参考方案1】:

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

initialContext.lookup(queueConnectionJndi);

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

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

【讨论】:

【参考方案2】:

这个Post on old nabble 听起来像一个类似的问题,可能会帮助你。

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

这个Post on the spring fourm 还指出了由不应存在的类路径中包含的 jar 引起的这种性质的问题

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

naming.jar
providerutil.jar
jndi.jar
jms.jar
mq.jar
websphere.jar

【讨论】:

您的可部署 EAR 有多复杂?它包含多个 JAR 和 WAR,还是仅包含一个 WAR 文件? 它包含多个 JAR 和 WAR【参考方案3】:

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

import javax.jms.QueueConnectionFactory;
...

queueConnectionFactory = (QueueConnectionFactory)initialContext.lookup(jndiName);

【讨论】:

我已经尝试过了,但在这种情况下,我得到了一些其他异常,例如未找到名称。 您使用的名称是什么,您是否通过 web.xml 引用它?【参考方案4】:

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

【讨论】:

通过从 ActiveMQ 依赖项中排除 geronimo jar 解决了类似的问题。 @srini :您能告诉我在哪里可以找到这些用于 MQ 的 WAS jar。 WAS里面有这么多的jar文件,我很困惑。你能帮帮我吗?【参考方案5】:

为了找到答案(至少是我的问题的答案),我经历了很多尝试和错误。我希望这个解决方案也能解决你的问题。正如另一篇文章中提到的,不包括 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 上,它无论如何都会使用它的库。

【讨论】:

以上是关于WebSphere MQ 配置问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 JMS 的 WebSphere MQ

JMS 的 Spring 配置(Websphere MQ - SSL、Tomcat、JNDI、非 IBM JRE)

IBM websphere MQ远程队列的简单配置

查找有关已配置 WebSphere MQ 队列管理器的位置的服务器详细信息

IBM WebSphere MQ介绍安装以及配置服务详解

将 Apache ServiceMix 连接到 Websphere MQ