【发布时间】:2015-07-29 21:02:46
【问题描述】:
我在同一个 tomcat jvm 中部署了 2 个应用程序。每个应用程序都有自己的 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"/>
我在任何一场战争中都没有 MQ 或 jms 罐子。它们位于 MQ 客户端安装上。然后我使用 catalina.properties 的 shared.loader 在类路径中添加:
shared.loader=${catalina.home}/shared/*.jar,/opt/mqm/java/lib/*.jar
每个应用程序在单独部署时都很好。但是当它们一起部署在同一个 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)
所以 app1 工作正常,但 app2 因上述异常而失败。我通常注意到这种错误是当我们遇到类加载问题时。但在这种情况下,我无法弄清楚问题出在哪里。任何线索都会有所帮助。
编辑:经过一些测试,我想,如果 tomcat 先加载 app1,那么这两个应用程序都可以正常工作。但是如果它选择 app2 那就有问题了。似乎 app2 正在使用错误的类加载器加载 MQ 类。不知道为什么。我已经检查了战争。它不包含 MQ 类。
【问题讨论】:
标签: tomcat jms jndi ibm-mq spring-jms