如果qmanager JNDI是在多个tomcat context.xml中定义的,则MQ JNDI异常

如果qmanager JNDI是在多个tomcat context.xml中定义的,则MQ JNDI异常,tomcat,jms,jndi,ibm-mq,spring-jms,Tomcat,Jms,Jndi,Ibm Mq,Spring Jms,我在同一个tomcat jvm中部署了两个应用程序。每个应用程序都有自己的context.xml: -app1.xml -app2.xml 在每个app*.xml中,我都定义了MQ jndi资源: <!-- JMS configuration FOR MQSeries - The connection factory --> <Resource name="jms/JMSQueueConnectionFactory" auth="Container"

我在同一个tomcat jvm中部署了两个应用程序。每个应用程序都有自己的context.xml: -app1.xml -app2.xml 在每个app*.xml中,我都定义了MQ jndi资源:

<!-- JMS configuration FOR MQSeries - The connection factory -->
 <Resource
      name="jms/JMSQueueConnectionFactory"
      auth="Container"
      type="com.ibm.mq.jms.MQQueueConnectionFactory"
      factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory"
      description="JMS Queue Connection Factory for sending messages"
      CCDTURL="file:///apps/mqm_opt/creds/AMQCLCHL_XA.TAB"
      QMGR="***Example***QM01***Example***" UCP="Y"/>
单独部署时,每个应用程序都可以正常运行。但是,当它们一起部署在同一个jvm中时,我会在其中一个应用程序启动时得到一个空指针:

Jul 29, 2015 6:15:14 PM org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
java.lang.NullPointerException
        at com.ibm.msg.client.jms.internal.JmsFactoryFactoryImpl.getInstance(JmsFactoryFactoryImpl.java:169)
        at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.setProviderFactory(JmsConnectionFactoryImpl.java:176)
        at com.ibm.mq.jms.MQConnectionFactory.<init>(MQConnectionFactory.java:286)
        at com.ibm.mq.jms.MQQueueConnectionFactory.<init>(MQQueueConnectionFactory.java:76)
        at com.ibm.mq.jms.MQQueueConnectionFactoryFactory.getObjectInstance(MQQueueConnectionFactoryFactory.java:73)
        at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
        at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
        at javax.naming.InitialContext.lookup(Unknown Source)
        at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
        at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
        at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
        at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
        at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
        at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
        at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201)
        at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:187)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
2015年7月29日下午6:15:14 org.apache.naming.NamingContext查找
警告:意外的异常解析引用
java.lang.NullPointerException
位于com.ibm.msg.client.jms.internal.jmsfactoryfactorympl.getInstance(jmsfactoryfactorympl.java:169)
位于com.ibm.msg.client.jms.admin.jmsconnectionfactorympl.setProviderFactory(jmsconnectionfactorympl.java:176)
位于com.ibm.mq.jms.MQConnectionFactory。(MQConnectionFactory.java:286)
位于com.ibm.mq.jms.MQQueueConnectionFactory。(MQQueueConnectionFactory.java:76)
位于com.ibm.mq.jms.MQQueueConnectionFactoryFactory.getObjectInstance(mqqueueConnectionFactoryFactoryFactory.java:73)
位于org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
位于javax.naming.spi.NamingManager.getObjectInstance(未知源)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:842)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:153)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:830)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:153)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:830)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:153)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:830)
位于org.apache.naming.NamingContext.lookup(NamingContext.java:167)
在org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)上
位于javax.naming.InitialContext.lookup(未知源)
位于org.springframework.jndi.jndemplate$1.doInContext(jndemplate.java:154)
位于org.springframework.jndi.jndemplate.execute(jndemplate.java:87)
位于org.springframework.jndi.jndemplate.lookup(jndemplate.java:152)
位于org.springframework.jndi.jndemplate.lookup(jndemplate.java:178)
位于org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
位于org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
位于org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201)
位于org.springframework.jndi.JndiObjectFactoryBean.afterPropertieSet(JndiObjectFactoryBean.java:187)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
因此,app1工作正常,但app2因上述异常而失败。我通常注意到这种错误是在我们有类加载问题时出现的。但在这种情况下,我无法找出问题所在。任何线索都会有帮助

编辑:经过一些测试后,我想,如果tomcat先加载app1,那么这两个应用都可以正常工作。但是如果它选择app2,那么就有问题了。似乎app2正在使用错误的类加载器加载MQ类。不知道为什么。我已经检查了战争。它不包含MQ类。

根据中的注释,我建议使用TomCat中的资源 应该是这样的

<Resource name="jms/MyJMSCF" auth="Container"
          type="com.ibm.mq.jms.MQConnectionFactory"
          factory="org.apache.naming.factory.BeanFactory"
          hostName="my.host.name"
          transportType="1"/>  <!-- 1 means client mode -->

MQConnectionFactory应该是兼容的bean样式对象;有很多配置选项-完整的JavaDoc是

JNDI仅使用com.ibm.mq.jms.MQQueueConnectionFactoryFactory对象通过javax.naming.ReferenceCable接口重新膨胀对象存储。

基于中的注释,我建议使用TomCat中的资源 应该是这样的

<Resource name="jms/MyJMSCF" auth="Container"
          type="com.ibm.mq.jms.MQConnectionFactory"
          factory="org.apache.naming.factory.BeanFactory"
          hostName="my.host.name"
          transportType="1"/>  <!-- 1 means client mode -->

MQConnectionFactory应该是兼容的bean样式对象;有很多配置选项-完整的JavaDoc是


JNDI仅使用com.ibm.mq.jms.MQQueueConnectionFactoryFactory对象通过javax.naming.ReferenceCable接口重新膨胀对象存储。

上次编辑给了我线索。经过仔细检查,我意识到我在app2.war中打包了一些mqjar/类。这就是为什么当首先加载app2.war时,它将使用WebApp2类加载器加载,而app1.war无法访问该类。这就是app1无法加载的原因。 而app1.war没有任何mq类。因此,当app1首次加载时,MQ类由两个应用程序都可以访问的系统类加载器加载。

解决方案显然是从app2中删除mq JAR。war上次编辑给了我线索。经过仔细检查,我意识到我在app2.war中打包了一些mqjar/类。这就是为什么当首先加载app2.war时,它将使用WebApp2类加载器加载,而app1.war无法访问该类。这就是app1无法加载的原因。 而app1.war没有任何mq类。因此,当app1首次加载时,MQ类由两个应用程序都可以访问的系统类加载器加载。

解决方案显然是从app2中删除mq JAR。war

我不确定这是如何解决上述问题的。我正在使用tomcat7。此外,上面的配置是定义IBM MQ连接工厂的推荐方法。我不确定这是如何解决上述问题的。我正在使用tomcat7。此外,上面的配置是定义IBM MQ连接工厂的推荐方法。