2013-04-02 3 views
1

Я следующий маршрут определяется с помощью Spring DSL:Настройка Apache Camel Dead Letter Handler

<camelContext id="myapp-camel-ctx" errorHandlerRef="deadLetterErrorHandler" 
xmlns="http://camel.apache.org/schema/spring"> 
    <route id="myapp-camel-route"> 
     <from uri="timer://runOnce?repeatCount=1&amp;delay=10" /> 

     <to uri="bean:fizzBean?method=doFizz" /> 

     <!-- What I call the "Smooks processor" --> 
     <to uri="smooks://my-smooks-config.xml" /> 

     <to uri="bean:buzzBean?method=doBuzz" /> 
    </route> 
</camelContext> 

<bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder"> 
    <property name="deadLetterUri" value="bean:errorCatcher" /> 
</bean> 

<bean id="errorCatcher" class="com.me.myorg.myapp.ErrorCatcher"> 
    <property name="foo" value="BAR" /> 
</bean> 

Иногда, в зависимости от выхода (исходящее сообщение) в fizzBean, процессор Smooks бросает исключение, и вешает цельные заявление. Когда он это делает, я вижу, что исключение выбрано в журналах приложений (это фактически исключение MySQL), но не уверен, как его обернуть/уловить и продолжить обработку. I подумал, что, учитывая установленную выше настройку ErrorCatcher, будет обработано брошенное исключение MySQL и что маршрут продолжит обработку. Вместо этого я никогда не вижу доказательств в моих журналах приложений, что метод ErrorCatcher#handle выполняется, когда выбрасываются эти исключения Smooks/MySQL.

Я что-то неправильно настроил здесь? Могу ли я что-нибудь сделать (либо с помощью конфигураций URI процессора Smooks, либо с помощью чего-то еще), чтобы исключить исключения изнутри этого процессора из висящего всего приложения? Заранее спасибо!

+0

Какую версию верблюда вы используете? У нас была ошибка, когда установка обработчика ошибок в не работала должным образом. Но настройка его на будет работать. –

ответ

2

Это зависит от того, как команда Smooks внедрила свой компонент Camel. Обработчик ошибок Camel запускается только в том случае, если было выбрано исключение, которое может перехватить Camel; или в Exchange используется исключение с использованием setException. Если Smooks этого не делают (возможно, они поймают исключение и не распространяют это обратно на Camel), то Camel не может обнаружить это исключение и отреагировать на него.

Если вы хотите увидеть, что происходит во время выполнения, вы можете включить трассирующие http://camel.apache.org/tracer

внимания также, что, когда вы используете компонент для обработки исключения с обработчик ошибок. Затем прочитайте этот FAQ, как получить доступ к вызванному исключению: http://camel.apache.org/why-is-the-exception-null-when-i-use-onexception.html

0

конфигурация кажется правильным, если вы хотите увидеть, что это работает, вы можете изменить методы ручки подписи следующим

public void handle(Exception exception, Exchange exchange) { 
    System.out.println("Got Exception..."+exception.getMessage()); 
    System.out.println("Exchange is :"+exchange); 
    } 

теперь вы можете увидеть результат на консоли ...

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