3
.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"); 没有被调用。

我错了什么?

如何为骆驼路线注册全局异常处理程序?

4

1 回答 1

4

将 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");
于 2017-11-30T22:47:52.330 回答