骆驼并没有捕获异常

时间:2017-11-30 17:20:53

标签: java exception apache-camel dsl spring-camel

.from("seda:rest_upload")
                .process(new Processor() {
                    @Override
                    public void process(Exchange exchange) {
                        if(true){
                            throw new RuntimeException();
                        }})
                .to("seda:parsed_csv")
                .onException(Exception.class).process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                logger.warn("Error");
            }
        });

但未调用logger.warn("Error");

我错了什么?

如何为camel路由注册全局异常处理程序?

1 个答案:

答案 0 :(得分:3)

在路由顶部移动onException块,不要忘记end()终结符。

end()告诉Camel,onException块结束。如果您省略,Camel会将其视为一个onException块。简单地说,seda上没有路由消耗而没有输出处理器,因为onException()之后的所有内容都会成为onException块的一部分。

路由特定的异常处理: 处理路线seda:rest_upload

中发生的异常
from("seda:rest_upload")
    .onException(Exception.class).process(exchange -> logger.warn("Error")).end()
    .process(e -> {throw new RuntimeException();})
    .to("seda:parsed_csv");

from("seda:parsed_csv").to("log:parsed_csv");

from("timer:tmr?period=1000")
    .setBody(constant("mock"))
    .to("seda:rest_upload");

全局异常处理:处理当前RouteBuilder

中所有路由中的例外情况
onException(Exception.class).process(exchange -> logger.warn("Error")); //There is no need for end(), whole block is part of onException block

from("seda:rest_upload")
    .process(e -> {throw new RuntimeException();})
    .to("seda:parsed_csv");

from("seda:parsed_csv").to("log:parsed_csv");

from("timer:tmr?period=1000")
    .setBody(constant("mock"))
    .to("seda:rest_upload");