我们在weblogic上运行这段特殊代码,它的功能是从
XML输入字符串返回特定于输入类的java对象.代码本身将由多个线程(50)使用.
public static Object toXMLObject(String XMLString,Class xmlClass) throws Exception { StringReader strReader = null; try { JAXBContext context = JAXBContexts.getJAXBContext(xmlClass); //Cached JAXBContext Unmarshaller unmarshaller = context.createUnmarshaller(); strReader = new StringReader(XMLString); return unmarshaller.unmarshal(strReader); } catch(Exception e){ throw e; } finally { if(strReader != null){ strReader.close(); } } }
我们从线程转储中看到的是多个线程(51个线程)试图锁定单个对象
ExecuteThread: '52' for queue: 'automation'" daemon prio=3 tid=0x0000000103bcf800 nid=0x1a4 waiting for monitor entry [0xfffffffac2cfb000]** java.lang.Thread.State: BLOCKED (on object monitor) at sun.misc.URLClasspath.getLoader(URLClasspath.java:279) - locked <0xfffffffb89f00ed8> (a sun.misc.URLClasspath) at sun.misc.URLClasspath.findResource(URLClasspath.java:145) at java.net.urlclassloader$2.run(urlclassloader.java:385) at java.security.AccessController.doPrivileged(Native Method) at java.net.urlclassloader.findResource(urlclassloader.java:382) at java.lang.classLoader.getResource(ClassLoader.java:1002) at java.lang.classLoader.getResource(ClassLoader.java:997) at java.lang.classLoader.getResource(ClassLoader.java:997) at weblogic.utils.classloaders.GenericclassLoader.getResourceInternal(GenericclassLoader.java:168) at weblogic.utils.classloaders.GenericclassLoader.getResource(GenericclassLoader.java:182) at weblogic.utils.classloaders.FilteringClassLoader.getResourceInternal(FilteringClassLoader.java:129) at weblogic.utils.classloaders.GenericclassLoader.getResourceInternal(GenericclassLoader.java:154) at weblogic.utils.classloaders.GenericclassLoader.getResource(GenericclassLoader.java:182) at java.lang.classLoader.getResourceAsstream(ClassLoader.java:1192) at org.apache.xerces.parsers.SecuritySupport$6.run(UnkNown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.xerces.parsers.SecuritySupport.getResourceAsstream(UnkNown Source) at org.apache.xerces.parsers.ObjectFactory.findJarServiceProvider(UnkNown Source) at org.apache.xerces.parsers.ObjectFactory.createObject(UnkNown Source) at org.apache.xerces.parsers.ObjectFactory.createObject(UnkNown Source) at org.apache.xerces.parsers.SAXParser. (UnkNown Source) at org.apache.xerces.parsers.SAXParser. (UnkNown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser. (UnkNown Source) at org.apache.xerces.jaxp.SAXParserImpl. (UnkNown Source) at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(UnkNown Source) at weblogic.xml.jaxp.RegistrySAXParser. (RegistrySAXParser.java:65) at weblogic.xml.jaxp.RegistrySAXParser. (RegistrySAXParser.java:46) at weblogic.xml.jaxp.RegistrySAXParserFactory.newSAXParser(RegistrySAXParserFactory.java:91) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.getXMLReader(AbstractUnmarshallerImpl.java:86) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194) at com.util.XMLParserUtil.toXMLObject(XMLParserUtil.java:699) ExecuteThread: '78' for queue: 'automation'" daemon prio=3 tid=0x000000010363b800 nid=0x1be waiting for monitor entry [0xfffffffabf8fb000]** java.lang.Thread.State: BLOCKED (on object monitor) at sun.misc.URLClasspath.getLoader(URLClasspath.java:279) - waiting to lock <0xfffffffb89f00ed8> (a sun.misc.URLClasspath) at sun.misc.URLClasspath.findResource(URLClasspath.java:145) at java.net.urlclassloader$2.run(urlclassloader.java:385) at java.security.AccessController.doPrivileged(Native Method) at java.net.urlclassloader.findResource(urlclassloader.java:382) at java.lang.classLoader.getResource(ClassLoader.java:1002) at java.lang.classLoader.getResource(ClassLoader.java:997) at java.lang.classLoader.getResource(ClassLoader.java:997) at weblogic.utils.classloaders.GenericclassLoader.getResourceInternal(GenericclassLoader.java:168) at weblogic.utils.classloaders.GenericclassLoader.getResource(GenericclassLoader.java:182) at weblogic.utils.classloaders.FilteringClassLoader.getResourceInternal(FilteringClassLoader.java:129) at weblogic.utils.classloaders.GenericclassLoader.getResourceInternal(GenericclassLoader.java:154) at weblogic.utils.classloaders.GenericclassLoader.getResource(GenericclassLoader.java:182) at java.lang.classLoader.getResourceAsstream(ClassLoader.java:1192) at org.apache.xerces.parsers.SecuritySupport$6.run(UnkNown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.xerces.parsers.SecuritySupport.getResourceAsstream(UnkNown Source) at org.apache.xerces.parsers.ObjectFactory.findJarServiceProvider(UnkNown Source) at org.apache.xerces.parsers.ObjectFactory.createObject(UnkNown Source) at org.apache.xerces.parsers.ObjectFactory.createObject(UnkNown Source) at org.apache.xerces.parsers.SAXParser. (UnkNown Source) at org.apache.xerces.parsers.SAXParser. (UnkNown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser. (UnkNown Source) at org.apache.xerces.jaxp.SAXParserImpl. (UnkNown Source) at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(UnkNown Source) at weblogic.xml.jaxp.RegistryXMLReader.getXMLReader(RegistryXMLReader.java:523) at weblogic.xml.jaxp.RegistryXMLReader.getXMLReaderInternal(RegistryXMLReader.java:453) at weblogic.xml.jaxp.RegistryXMLReader.parse(RegistryXMLReader.java:158) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194) at com.util.XMLParserUtil.toXMLObject(XMLParserUtil.java:699)
我们是否正确实现了JAXB代码?我们怎么能克服这个问题呢.
PS.我们在JDK1.6.0_33上用最新版本(1.4.6)覆盖了JAXP
解决方法
您可以尝试执行以下操作:
package forum11344031; import java.io.StringReader; import javax.xml.bind.*; import javax.xml.stream.*; public class Demo { private static final XMLInputFactory XIF = XMLInputFactory.newFactory(); public static Object toXMLObject(String XMLString,Class xmlClass) throws Exception { Object o; StringReader strReader = null; try { JAXBContext context = JAXBContexts.getJAXBContext(xmlClass); //Cached JAXBContext Unmarshaller unmarshaller = context.createUnmarshaller(); strReader = new StringReader(XMLString); XMLStreamReader xmlStreamReader = XIF.createXMLStreamReader(strReader); o = unmarshaller.unmarshal(xmlStreamReader); xmlStreamReader.close(); } catch(Exception e){ throw e; } finally { if(strReader != null){ strReader.close(); } } return o; } }