2014-02-26 57 views
2

我在WSO2 ESB 4.6.0中構建了一個處理大量消息的代理,但現在它拋出了此異常。
爲什麼會發生,我該如何解決這個問題?XSLT錯誤 - 已超過NamePool限制

ERROR {org.apache.synapse.mediators.transform.XSLTMediator} - Unable to perform XSLT transformation using : Value {name ='null', keyValue ='conf:ManageWorkforce/xslt/SoapFaultToStandardHeader.xsl'} against source XPath : s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1] {org.apache.synapse.mediators.transform.XSLTMediator} 
net.sf.saxon.om.NamePool$NamePoolLimitException: NamePool limit exceeded: max 1023 prefixes per URI 
    at net.sf.saxon.om.NamePool.allocate(NamePool.java:437) 
    at net.sf.saxon.om.FingerprintedQName.allocateNameCode(FingerprintedQName.java:99) 
    at net.sf.saxon.tree.tiny.TinyBuilder.startElement(TinyBuilder.java:235) 
    at net.sf.saxon.event.ReceivingContentHandler.startElement(ReceivingContentHandler.java:285) 
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:405) 
    at net.sf.saxon.event.Sender.send(Sender.java:178) 
    at net.sf.saxon.Controller.transform(Controller.java:1790) 
    at org.apache.synapse.mediators.transform.XSLTMediator.performXSLT(XSLTMediator.java:289) 
    at org.apache.synapse.mediators.transform.XSLTMediator.mediate(XSLTMediator.java:191) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71) 
    at org.apache.synapse.mediators.filters.FilterMediator.mediate(FilterMediator.java:112) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:230) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:443) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:166) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:217) 
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

編輯

我注意到,標有 「返回請求狀態」 複選框DSS操作,返回的是一樣的東西:

<axis2ns5:REQUEST_STATUS xmlns:axis2ns5="http://ws.wso2.org/dataservice">SUCCESSFUL</axis2ns5:REQUEST_STATUS> 

其中數字5在每個服務請求的前綴都會增加。我想當這個數字達到1024時,會發生這個錯誤。

我想弄清楚如何防止這種情況。

回答

1

你可以找到這個問題存在的細節:http://sourceforge.net/p/saxon/mailman/message/27969616/

這他的不同前綴的一個全球性的限制同一個命名空間

一個解決辦法是標準化的前綴,如果你能

+0

有一種方法可以避免使用只有XSLT,而是更改WSO2的源代碼? – elias

2

這在2011年Jean-Michel所提到的線索中得到了廣泛的討論。

從那時起,就有了進一步的發展來減少對NamePool的依賴。其中最重要的一點是,當您使用第三方樹形模型(如JDOM2或AXIOM)時,不再分配NamePool名稱代碼。因此,如果您將處理切換爲使用這種樹模型,則可以處理由Axis2生成的奇怪的XML文件(它使用大量的名稱空間前綴),而不會造成撒克遜限制。