快速业务通道

关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
 } 61         if(s1 == null) 62         { 63             throw new ConfigurationError("Provider for " + s + " cannot be found", null); 64         } else 65         { 66             debugPrintln("loaded from fallback value: " + s1); 67             return newInstance(s1, classloader); 68         } 69     } 70

关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题(3)

时间:2010-12-25 BlogJava 走走停停又三年

看看两个方法的具体实现,这个问题基本一目了然了吧。 在我们要解析XML文件的时候,我们首先需要从parser factory获取一个parser实例,但parser factroy是什么? 我们需要去查找。仔细看一下这个查找顺序:

1:System property, JVM中是否定义了javax.xml.parsers.SAXParserFactory,这个可以通过-D设定

2:$JRE_HOME/ lib/jaxp.properties文件,是否存在javax.xml.parsers.SAXParserFactory键值对

3:xerces.jar文件的meta-inf/services/javax.xml.parsers.SAXParserFactory文件是否有值

4:当前classloader,是否存在org.apache.xerces.jaxp.SAXParserFactoryImpl,

从thread dump可以看到,客户线程挂在了3上,因为1, 2条件不成立,所以走到了3, 而3每次都要打开jar文件,最终看到线程都停在了java.util.zip.ZipFile.getEntry()上。 解决方法:

1:启动JVM的时候,增加-Djavax.xml.parsers.SAXParserFactory=***

2::在$JRE_HOME/lib/增加jaxp.properties文件,其中定义javax.xml.parsers.SAXParserFactory=***

3:用展开的xerces.jar文件代替原有的jar文件

客户同时提及了另外一个问题:我们有自己的parser factory, 为什么最后用了weblogic的? 而且不停的load class? Trace 如下:

"ExecuteThread: ''42'' for queue: ''OCS.Thread.Pool''" daemon prio=5 tid=004ca430 nid=245 lwp_id=1886146 waiting for monitor entry [0x1d9ba000..0x1d9ba4f0] at java.lang.ClassLoader.loadClass(ClassLoader.java:278) - waiting to lock <364cdf18> (a weblogic.utils.classloaders.GenericClassLoader) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:224) at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:93) at javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:174) ......

其实在上面的分析中可以看到,前三项中都没有找到parser factory, 那我们只能在当前class loader中去查找,并创建instance。因为你的应用部署在weblogic上, weblogic的classloader机制是,所有的应用class loader都继承于weblogic application class loader, 所以你会看到weblogic class loader在trace中。但为什么不停的在class loader呢?其实看看JDK文档,并看看JDK的实现就能知道,

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException

Loads the class with the specified binary name. The default implementation of this method searches for classes in the following order:

Invoke findLoadedClass(String) to check if the class has already been loaded.

Invoke the loadClass method on the parent class loader. If the parent is null the class loader built-in to the virtual machine is u

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号