尝试解析apache-commons-chains的目录XML时出现EmptyStackException

时间:2019-04-29 12:32:05

标签: java apache-commons

我有一个在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对象。但这会引发错误。

1 个答案:

答案 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;
    }