我在同一个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类。答案 0 :(得分:0)
基于http://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html#Using_resources中的注释,我会建议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 http://www-01.ibm.com/support/knowledgecenter/api/content/SSFKSJ_8.0.0/com.ibm.mq.javadoc.doc/WMQJMSClasses/com/ibm/mq/jms/MQConnectionFactory.html
JNDI仅使用com.ibm.mq.jms.MQQueueConnectionFactoryFactory对象通过javax.naming.Referencable接口重新扩充对象存储。
答案 1 :(得分:0)
最后一次编辑给了我线索。仔细检查后,我意识到我在app2.war中打包了一些MQ jar / classes。这就是为什么当app2.war首先加载时,它将使用WebApp2类加载器加载,app1.war无法访问此类。这就是app1无法加载的原因。 虽然app1.war没有任何mq类。因此,当app1首先加载时,MQ类由System类加载器加载,两个应用程序都可以访问它们 解决方案显然是从app2.war
中删除mq jar