在过去的几周里,我一直在尝试在聚合后使用XSLT处理骆驼路线上的间歇性问题。从某种意义上说,这是断断续续的,尽管它经常引发此异常,但我可以重新运行几秒钟后失败的数据提取和处理,并且通常可以成功。我尚未找到任何持续失败的数据。
我假设聚合是导致问题的原因,但是我一生无法理解原因。我以为这可能是我正在使用的自定义聚合bean,所以我用XSLTAggreationStrategy替换了它,但是在进一步转换聚合XML或将其写到文件中时,它仍然间歇性地出现此问题。
这是在Apache-Karaf环境中执行的,我已经加载了Camel-Saxon 2.21.2和Apache ServiceMix Saxon-HE 9.8.0.8_1软件包。
感谢您的光临。
删节的堆栈跟踪为:
... 造成原因:[java.lang.NullPointerException- null] java.lang.NullPointerException 在net.sf.saxon.dom.DOMNodeWrapper $ ChildEnumeration.skipFollowingTextNodes(DOMNodeWrapper.java:1149) 在net.sf.saxon.dom.DOMNodeWrapper $ ChildEnumeration.next(DOMNodeWrapper.java:1178) 在net.sf.saxon.tree.util.Navigator $ EmptyTextFilter.next(Navigator.java:1078) 在net.sf.saxon.tree.util.Navigator $ AxisFilter.next(Navigator.java:1039) 在net.sf.saxon.tree.util.Navigator $ AxisFilter.next(Navigator.java:1017) 在net.sf.saxon.expr.parser.ExpressionTool.effectiveBooleanValue(ExpressionTool.java:643) 在net.sf.saxon.expr.Expression.effectiveBooleanValue(Expression.java:532) 在net.sf.saxon.pattern.PatternWithPredicate.matches(PatternWithPredicate.java:141) 在net.sf.saxon.trans.Mode.searchRuleChain(Mode.java:570) 在net.sf.saxon.trans.Mode.getRule(Mode.java:476) 在net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1041) 在net.sf.saxon.expr.instruct.ApplyTemplates.apply(ApplyTemplates.java:281) 在net.sf.saxon.expr.instruct.ApplyTemplates.processLeavingTail(ApplyTemplates.java:241) 在net.sf.saxon.expr.instruct.Template.applyLeavingTail(Template.java:239) 在net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1057) 在net.sf.saxon.expr.instruct.ApplyTemplates.apply(ApplyTemplates.java:281) 在net.sf.saxon.expr.instruct.ApplyTemplates.process(ApplyTemplates.java:237) 在net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:431) 在net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:373) 在net.sf.saxon.expr.instruct.Template.applyLeavingTail(Template.java:239) 在net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1057) 在net.sf.saxon.Controller.transformDocument(Controller.java:2080) 在net.sf.saxon.Controller.transform(Controller.java:1903) 在org.apache.camel.builder.xml.XsltBuilder.process(XsltBuilder.java:141) 在org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:103) 在org.apache.camel.component.xslt.XsltEndpoint.onExchange(XsltEndpoint.java:138)...
答案 0 :(得分:3)
在9.8.0.8版中,类net.sf.saxon.dom.DOMNodeWrapper
仅具有1144行,因此显示1178行的堆栈跟踪表明存在某种版本控制问题。
类DOMNodeWrapper
最初是在9.5中引入的(以前称为NodeWrapper
),并且行号与当前9.5源中的行号仅相差一个,因此我怀疑您已加载了什么是9.5分支的某些子版本。堆栈跟踪中的其他行号也与此保持一致,即9.5。
这当然不能解释问题,但可能会提供线索。
我的直觉是自9.5年以来的几年中,我们可能已经修复了多线程错误。 DOM不是线程安全的,因此Saxon非常注意同步其访问。撒克逊臭虫https://saxonica.plan.io/issues/2376解决了这个问题。在9.5分支上,此问题最初是在维护版本9.5.1.11中修复的,因此很可能没有该修补程序。我认为调查一下为什么要加载旧版本的Saxon很有用,而另一个有用的角度是准确找到它是哪个版本(静态方法net.sf.saxon.Version.getProductVersion()
将为您提供此信息。)
偶然地,如果您正在使用对DOM树的多线程访问,那么您应该问自己这是否是一个好主意。 Saxon在最佳情况下对DOM的访问速度很慢(与JDOM和XOM相比,更不用说Saxon的本机树模型了),并且由于缺乏线程安全性以及对同步的需求,因此它在多线程应用程序中是一个很差的选择
另外,请注意,Saxon可以同步其对DOM的访问,但不能与可能也使用DOM的第三方代码同步。