我有一个在Oracle weblogic中运行的Java项目。我们正在使用apache-commons-chains。尝试解析XML时,我们间歇性地获得EmptyStackException。在大多数情况下,XML都是有效的。但是有时候我们会遇到这个问题。
我尝试在本地计算机上运行和调试代码。那里从来没有发现问题。 这是日志堆栈
java.util.EmptyStackException 在org.apache.commons.collections.ArrayStack.pop(ArrayStack.java:122) 在org.apache.commons.digester.Digester.endElement(Digester.java:1208) 在com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609) 在com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) 在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343) 在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786) 在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) 在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) 在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) 在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) 在com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 在com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) 在com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:648) 在weblogic.xml.jaxp.WebLogicXMLReader.parse(WebLogicXMLReader.java:133) 在weblogic.xml.jaxp.RegistryXMLReader.parse(RegistryXMLReader.java:173) 在org.apache.commons.digester.Digester.parse(Digester.java:1827) 在org.apache.commons.chain.config.ConfigParser.parse(ConfigParser.java:190)
public Catalog getCatalog() throws Exception {
if (catalog == null) {
parser.parse(IAFullEngineWorkFlow.class.getClassLoader().getResource("/resource URI/"));
catalog = CatalogFactoryBase.getInstance().getCatalog();
}
return catalog;
}
理想情况下,我们应该从中获取Catalog对象。但这会引发错误。
答案 0 :(得分:0)
找到了解决方案。 Apache Commons中的解析器不是线程安全的。只需在getCatalog函数中使用同步即可。
`
public synchronised static Catalog getCatalog() throws Exception {
if (catalog == null) {
parser.parse(SampleClass.class.getClassLoader().getResource("/resource URI/"));
catalog = CatalogFactoryBase.getInstance().getCatalog();
}
return catalog;
}