2016-09-06 5 views
1

Возможно ли реализовать какой-либо переключатель перед обработчиком ошибок apache-camel?Apache-camel - настраиваемая обработка ошибок

Что-то вроде: Если это MyException.class, тогда используйте обработчик ошибок по умолчанию, иначе используйте мертвый канал письма для обработки ошибки.

Я пытаюсь использовать, но кажется, что это невозможно установить в глобальном масштабе так просто, как это должно быть в методе configure() каждого маршрута.

+0

Вы смотрели при ловле конкретных исключений, как показано здесь: http://camel.apache.org/try-catch-finally.html –

+0

я ищу какое-то общее решение, что будет применяться ко всем существующих маршрутов. Похоже, что необходимо определить для каждого маршрута. – hybaken

+1

Тогда функция onException() должна работать, если она имеет глобальную область действия: http://camel.apache.org/exception-clause.html Это подробно описано в книге «Верблюд в действии» –

ответ

0

Решение: Я использовал DeadLetterChannelBuilder в качестве обработчика ошибок с failureProcessor и deadLetterHandleNewException как ложь, что он сделал чек, что мне нужно (Повторное выбрасывание исключения/скрыть исключение).

Спасибо за совет, так или иначе, это привело меня к правильному пути.

1

Да, у вас может быть общий обработчик ошибок.

В методе конфигурирования я сделал так:

public void configure() throws Exception { 
    ExceptionBuilder.setup(this); 
    ... 
} 

ExceptionBuilder класс выглядеть следующим образом:

public class ExceptionBuilder { 

    public static void setup(RouteBuilder routeBuilder) { 
     routeBuilder.onException(Exception.class).useOriginalMessage().handled(true).to("direct:errorHandler"); 
    } 
} 

Наконец, в обработчик ошибок настроить его с вашими требованиями. Это означает, что сохранить тело и заголовки в файл журнала или отправить их в очередь jms или остановить обработку или что-нибудь еще. Это зависит от вас. Вы просто настраиваете его один раз и ссылаетесь на него со всех классов routeBuilder.

1

Глобальная область ошибкиHandler только экземпляра RouteBuilder. Вам нужно будет создать базовый класс RouteBuilder, содержащий логику обработки ошибок в своем методе configure(), а затем из него вывести все остальные маршруты (не забывая вызвать super.configure()).

Вы можете использовать комбинацию ErrorHandler как улов-все за исключение, с конкретными исключениями, обработанных OnException()

errorHandler(deadLetterChannel("mock:generalException")); 

onException(NullPointerException.class) 
    .handled(true) 
    .to("mock:specificException"); 

Любых маршрутами с этими обработчиками будут посылать обмены, которые бросают в NullPointerException к конечной точке " издеваться: specificException». Любые другие выброшенные исключения будут обрабатываться errorHandler, и обмен будет отправлен на «mock: generalException».

http://camel.apache.org/error-handler.html

http://camel.apache.org/exception-clause.html

0
Use try-catch in camel route 

.doTry() 
.to("bean:<beanName>?method=<method>") 
.endDoTry() 

.doCatch(MyException.class) 
.to("bean:<beanName>?method=<method1>") 
.doCatch(Exception.class) 
.to("bean:<beanName>?method=<method2>") 
+0

Мне нужно было что-то общее, что я не должен определять каждый маршрут. В любом случае, спасибо – hybaken

Смежные вопросы