Camel - поймать выброшенное исключение в Global onException - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь поймать свое собственное исключение в глобальном исключении onException.Я выбросил свое исключение после того, как исключение Jaxb было поймано.Однако CustomException не попадает в OnException

onException(Exception.class)
    .handled(true)
    .log("Globally Caught CustomException") 
    .end();

from("start:direct")
    .doTry()
        .unmarshal(soapMessage)
    .doCatch(JAXBException.class)
        .log("Locally Caught JAXBException")
        .throwException(new CustomException()
    .endDoTry();

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Согласно https://people.apache.org/~dkulp/camel/try-catch-finally.html (см. Раздел Обработка ошибок верблюда отключена ), при использовании doTry .. doCatch .. doFinally Обработчик ошибок верблюда не применяется.Таким образом, любой OnException не срабатывает.

Если вы хотите поймать исключение с помощью OnException, вы должны бросить его напрямую, а не внутри DoTry .. DoCatch.Теперь вы можете подумать о создании двух onException, один из которых обрабатывает Exception.class, а другой - JAXBException.class.

onException(Exception.class)
            .handled(true)
            .log("Globally Caught CustomException")
            .end();
onException(JAXBException.class)
            .handled(true)
            .throwException(new CustomException())
            .end();

Но опять-таки первый onException не будет вызван, потому что Верблюд не разрешает дальнейшую обработку ошибок, когда уже обрабатывает ошибку .Это делается с помощью org.apache.camel.processor.FataFallbackErrorHandler, который перехватывает новое исключение, регистрирует предупреждение, устанавливает его как исключение на Exchange и останавливает дальнейшую маршрутизацию (Camel In Action, второе издание).

0 голосов
/ 02 июля 2019

Попробуйте, я только что изменил ваш код, чтобы воспроизвести его, кажется, работает:

 onException(Exception.class)
            .handled(true)
            .log("Globally Caught CustomException")
            .end();

    from("timer://simpleTimer?period=1000")
            .setBody(simple("Timer at ${header.firedTime}"))
            .to("direct:demo");

    from("direct:demo")
            .doTry()
                .process(new Processor() {
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        throw new JAXBException("Some Exception");
                    }
                })
            .doCatch(JAXBException.class)
            .log("Locally Caught JAXBException")
            .throwException(new CustomException())
            .endDoTry();

Выход журнала: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...