【问题标题】:WebSphere MQ Configuration issuesWebSphere MQ 配置问题
【发布时间】: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);

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

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

【问题讨论】:

标签: java jms websphere ibm-mq mq


【解决方案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 标准(ConnectionFactoryQueueConnectionFactory)而不是 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 上,它无论如何都会使用它的库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多