【问题标题】:WMQ V8 Connection Factory setup on Tomcat using JNDI使用 JNDI 在 Tomcat 上设置 WMQ V8 连接工厂
【发布时间】:2015-08-12 11:04:30
【问题描述】:

目前我们使用 JNDI 的 Tomcat 配置是基于这个目前正在运行的建议。

How do I connect to a Websphere MQ (MQ Series) server using JMS and JNDI?

由于我们正在升级到 v8,因此我想利用 JMS 2.0 功能。这需要将 jar 文件更新为 JMS 2.0 版本。

所以我从 tomcat lib 文件夹中删除了以下 jar。

  • com.ibm.mq.jar
  • com.ibm.mqjms.jar
  • connector.jar
  • dhbcore.jar
  • geronimo-j2ee-management_1.0_spec-1.0.jar
  • geronimo-jms_1.1_spec-1.0.jar

并用这些罐子代替它们。基于此link

  • com.ibm.mq.allclient.jar
  • com.ibm.mq.traceControl.jar

我的 JNDI 配置与此配置匹配。

<Resource
      name="jms/MyQCF"
      auth="Container"
      type="com.ibm.mq.jms.MQQueueConnectionFactory"
      factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory"
      description="JMS Queue Connection Factory for sending messages"
      HOST="<mymqserver>"
      PORT="1414"
      CHAN="<mychannel>"
      TRAN="1"
      QMGR="<myqueuemanager>"/>

现在有了更新的 jar 文件,我得到了以下异常。

Caused by: java.lang.NoClassDefFoundError: javax/jms/JMSRuntimeException
    at com.ibm.mq.jms.MQQueueConnectionFactoryFactory.getObjectInstance(MQQueueConnectionFactoryFactory.java:69)
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:117)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:71)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:34)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:138)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:110)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:82)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:724)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 7 more

问题:

我应该在类路径中包含另一个 jar 文件吗?

或者 v8 的 JNDI 配置是否发生了变化?

【问题讨论】:

  • 尝试添加在 MQ 安装中找到的 jms.jar。
  • Umapathy 似乎 jms.jar 有所帮助。在您的 tomcat 设置中,您是否只包含 jms.jar 和 com.ibm.mq.allclient.jar?
  • 是的,它们是唯一用于 tomcat jms 客户端的 jars。

标签: tomcat jms ibm-mq


【解决方案1】:

尝试添加在 MQ 安装中找到的 JMS Jar。 IBM 从 v8.0 开始重新打包 JMS,因此现在支持 jar 文件的独立安装。但前提是您使用完整且完整的罐子,并且不要随意混合和匹配它们。这样做是鲁莽和不明智的。

您在正确的轨道上,但出于您的目的,我会从the latest 8.0.0.x MQ Client Fix Pack 获取文件。然后我会去the Technote that explains the install procedure 尝试一下。

我确信 IBM 有一个从服务器安装中获取 jar 包的流程,但是由于这些包的打包方式似乎不同,我会把钱花在为独立交付而设计和测试的包上——例如我在上面链接的那个。

顺便说一句,由于现在支持此功能,如果它不起作用,您可以打开 PMR,告诉 IBM 您完全按照他们的指示进行操作,并让他们与您一起修复它。 (然后在这里发布修复它的原因。)但是如果你只是去抓取随机的 jar 文件并希望它能正常工作,他们不会这样做。

【讨论】:

  • 同意。我应该更清楚。我的意思是 mq 安装(我认为 OP 会在 tomcat 服务器上完成客户端安装以至少收集 jars)。但是,我支持包含 jms.jar(不是来自其他任何地方,而是应该来自上面的 mq 安装)。在我将 jms.jar 包含在 allclient.jar 中之前,我得到了各种 javax/jms noclassdef found 错误。我在所有类型的独立 jms、spring 和部署在 tomcat 上的应用程序中都看到了这一点。
猜你喜欢
  • 2018-08-10
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多