Apache Camel:如何在doCatch()块内获取异常消息?

时间:2018-11-26 15:01:32

标签: apache spring-boot apache-camel dsl

我需要从引发的异常中返回消息,或者将其放入消息中。但是它不能在前端打印正确的消息。

骆驼文档建议使用.transform(simple?...) .handled(true),但大多数不推荐使用。

这样做的正确方法是什么?

回复:
<418 I'm a teapot,simple{${exception.message}},{}>


路线

from("direct:csv")
  .doTry()
    .process(doSomeThingWithTheFileProcessor)
  .doCatch(Exception.class)
    .process(e -> {
        e.getOut().setBody(new ResponseEntity<String>(exceptionMessage().toString(), HttpStatus.I_AM_A_TEAPOT));
    }).stop()
  .end()
  .process(finalizeTheRouteProcessor);


doSomethingWithFileProcessor

public void process(Exchange exchange) throws Exception {
        String filename = exchange.getIn().getHeader("CamelFileName", String.class);

        MyFile mf = repo.getFile(filename); //throws exception

        exchange.getOut().setBody(exchange.getIn().getBody());
        exchange.getOut().setHeader("CamelFileName", exchange.getIn().getHeader("CamelFileName"));
    }

2 个答案:

答案 0 :(得分:4)

有很多方法可以做到这一点。所有这些都是正确的,请根据错误处理的复杂性选择您喜欢的。我已经发布了examples in this gist。 Camel版本2.22.0中不推荐使用任何一个。

使用处理器

from("direct:withProcessor")
        .doTry()
            .process(new ThrowExceptionProcessor())
        .doCatch(Exception.class)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    final Throwable ex = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
                    exchange.getIn().setBody(ex.getMessage());
                }
            })
        .end();

使用简单的语言

from("direct:withSimple")
        .doTry()
            .process(new ThrowExceptionProcessor())
        .doCatch(Exception.class)
            .transform().simple("${exception.message}")
        .end();

使用setBody

from("direct:withValueBuilder")
        .doTry()
            .process(new ThrowExceptionProcessor())
        .doCatch(Exception.class)
            .setBody(exceptionMessage())
        .end();

答案 1 :(得分:2)

在doCatch()中,骆驼使用密钥Exchange.EXCEPTION_CAUGHT(http://camel.apache.org/why-is-the-exception-null-when-i-use-onexception.html)将异常移动到交换的属性中。

因此您可以使用

e.getOut().setBody(new ResponseEntity<String>(e.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class).getMessage(), HttpStatus.OK));