关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题
2009-09-22 00:00:00 来源:WEB开发网看看两个方法的具体实现,这个问题基本一目了然了吧。 在我们要解析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)
......
赞助商链接