#error-handling #apache-camel
#обработка ошибок #apache-верблюд
Вопрос:
У меня возникли проблемы с onException в моем контексте Camel. Я использую общий обработчик ошибок, который пытается извлечь дополнительную информацию об ошибках из exchange с помощью xpath при возникновении исключений. onException содержит предложение try / catch, предотвращающее возникновение дополнительных ошибок.
<onException>
<exception>java.lang.Exception</exception>
<handled>
<constant>true</constant>
</handled>
<!-- Try to get additional error information from the exchange-->
<doTry>
<setProperty name="error.code">
<xpath resultType="java.lang.String">//*[local-name()='error'][1]/@code</xpath>
</setProperty>
<doCatch>
<exception>java.lang.Exception</exception>
</doCatch>
</doTry>
</onException>
Проблема в том, что try / catch, похоже, не улавливает исключение при сбое xpath, например, когда тело не является xml. Вместо этого вызывается FatalFallbackErrorHandler и регистрируется следующее исключение:
Content is not allowed in prolog.: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
Ответ №1:
Как вы заметили, try / catch в onException
блоке ничего не помогает.
Всякий раз, когда во время обработки ошибок возникает исключение, FatalFallbackErrorHandler
срабатывает. Это и есть «аварийный перерыв» Camel. Вы не можете изменить это, и это делает следующее:
- улавливает исключение
- регистрирует предупреждение
- устанавливает исключение на бирже
- останавливает любую дальнейшую маршрутизацию
Это делается для предотвращения бесконечных циклических циклов между обработчиками ошибок или других проблем, которые могут возникнуть, когда обработчики ошибок выдают ошибки.
Что вы могли бы попробовать (я думаю, я никогда не пробовал этого), так это создать выделенный direct
маршрут для сбора информации об ошибках.
Вы вызываете его из обработчика ошибок с .to("direct:collectErrorInformation")
помощью .
Если xpath выдает ошибку, вы находитесь на обычном маршруте, и если вы также добавите onException
блок для ошибки проверки, вы сможете справиться с этим нормально.
Попробуйте, если хотите.
Комментарии:
1. Я нахожу это поведение немного странным, тем более, что <doTry> определяется в <onException> в XML-схеме camel-spring . Я бы ожидал, что любое исключение, возникающее в try / catch, будет обработано в этом предложении, независимо от того, находится ли оно в пределах обработки ошибок или где-либо еще.
Ответ №2:
Try / catch действительно улавливает исключение при сбое xpath, и FatalFallbackErrorHandler не вызывается. doTry / doCatch работает должным образом, даже если он находится в onException.
Ошибка с трассировкой регистрируется Camels jaxp XmlConverter, но исключение из onException не возникает.