骆驼没有捕捉到异常

Camel doesn't catch Exception

.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 路由注册全局异常处理程序?

将 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");