如果qmanager JNDI是在多个tomcat context.xml中定义的,则MQ JNDI异常
我在同一个tomcat jvm中部署了两个应用程序。每个应用程序都有自己的context.xml: -app1.xml -app2.xml 在每个app*.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"
<!-- 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连接工厂的推荐方法。