关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题 - 编程入门网
}
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 如下:
其实在上面的分析中可以看到,前三项中都没有找到parser factory, 那我们只能在当前class loader中去查找,并创建instance。因为你的应用部署在weblogic上, weblogic的classloader机制是,所有的应用class loader都继承于weblogic application class loader, 所以你会看到weblogic class loader在trace中。但为什么不停的在class loader呢?其实看看JDK文档,并看看JDK的实现就能知道,
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |