Что может быть причиной исключения NullPointerException при обработке Camel XSLT? - PullRequest
0 голосов
/ 11 июня 2019

В течение последних нескольких недель я пытался решить проблему с перебоями на верблюде, используя обработку XSLT после агрегации.Время от времени возникает ощущение, что, хотя это часто вызывает это исключение, я могу повторно запустить извлечение и обработку данных, которые потерпели неудачу несколько секунд спустя, и обычно это удается.Мне еще не удалось найти какие-либо данные, которые постоянно дают сбой.

Я предполагаю, что агрегация вызывает проблему, но я не могу понять, почему.Я подумал, что это может быть пользовательский компонент агрегации, который я использовал, поэтому я заменил его на 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) в сети.sf.saxon.expr.parser.ExpressionTool.effectiveBooleanValue (ExpressionTool.java:643) в net.sf.saxon.expr: 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 (ElementCreat.java: 431) по адресу net.sf.saxon.expr.instruct.ElementCreator.processLeavingХвост (ElementCreator.java:373) в net.sf.saxon.expr.instruct.Template.applyLeavingTail (Template.java:239) в net.sf.saxon.trans.Mode.applyTemplates (Mode.java:1057) в сети.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 Ответ

3 голосов
/ 11 июня 2019

В 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, вам следует спросить себя, является ли это хорошей идеей.Саксонский доступ к DOM медленнее в лучшие времена (по сравнению с JDOM и XOM, не говоря уже о собственной модели дерева Saxon), а отсутствие безопасности потоков и необходимость синхронизации делает его довольно плохим выбором в многопоточном приложении.

Также обратите внимание, что Saxon может синхронизировать свой собственный доступ к DOM, но не может синхронизироваться со сторонним кодом, который также может использовать DOM.

...