是什么导致骆驼XSLT处理中的NullPointerException?

时间:2019-06-11 15:31:47

标签: apache-camel saxon

在过去的几周里,我一直在尝试在聚合后使用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)...

1 个答案:

答案 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的第三方代码同步。