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 的 Spring 配置(Websphere MQ - SSL、Tomcat、JNDI、非 IBM JRE)