骆驼的收件人列表EIP的异常未在路由级别捕获

时间:2018-09-17 06:24:54

标签: apache-camel

骆驼版本2.22.0 运行时:SpringBoot:2.0.2.RELEASE JDK版本:1.8.0_121

EIP:收件人列表。

问题:在路由级别的onException子句中未捕获到receiveList的并行处理引发的异常。

下面是DSL

@Override     公共无效configure()引发异常{

restConfiguration().clientRequestValidation(true)
 //.contextPath("/pss/v1.0/")
 .port("8080").host("0.0.0.0")
 .enableCORS(true)
 .apiContextPath("/api-doc")
 .apiProperty("api.title", "Test REST API")
 .apiProperty("api.version", "v1")
 .apiContextRouteId("doc-api")
 .component("servlet")
 .bindingMode(RestBindingMode.json);

rest("/api/").clientRequestValidation(true)
 .id("api-route")
 .consumes("application/json")
 .get("/bean/{name}")
 .bindingMode(RestBindingMode.json)
 .to("direct:remoteService");

from("direct:remoteService")
    .onException(Exception.class).handled(true)
    .log("Exception Caught : ${exception.message}")
    .end()
    .recipientList(constant("direct:route1, direct:route2"), ",").parallelProcessing().aggregationStrategy(new GroupedBodyAggregationStrategy())
    .stopOnException()
    .end()
    .log("The final Exchange data : ${exception.message}")
    ;

from("direct:route1")
    .setHeader( Exchange.CONTENT_ENCODING, simple("gzip"))
    .setBody(simple("RESPONSE - [ {  \"id\" : \"bf383eotal length is 16250]]"))
    .log("${body}")
    ;

from("direct:route2")
.log("${body}")
.process(e-> {
    List<String> myList = new ArrayList();

    myList.add("A");
    myList.add("b");
    myList.add("C");

    e.getIn().setBody(myList);
})
.split(body())
.parallelProcessing(true)
.aggregationStrategy(new GroupedBodyAggregationStrategy())
.stopOnException()
.log("${body}")
.choice()
.when(simple("${body} == 'b'"))
   .throwException(new Exception("jsdhfjkASDf"))
    ;

}

2 个答案:

答案 0 :(得分:0)

尝试像这样使onException成为全局变量:

onException(Exception.class).handled(true)
.log("Exception Caught : ${exception.message}")
.end();

    from("direct:remoteService")
.recipientList(constant("direct:route1, direct:route2"), ",").parallelProcessing().aggregationStrategy(new GroupedBodyAggregationStrategy())
.stopOnException()
.end()
.log("The final Exchange data : ${exception.message}")
;

UPD:因此您需要在收件人路由中禁用错误​​处理程序。尝试使用this(无法正常插入代码示例)

答案 1 :(得分:0)

这是一个经典的错误:(就像拆分的EIP一样),每个收件人都会处理原始Exchange的副本。这些副本上的任何故障都不会影响处理交换的路由(引发例外),因为每个单个交换都在完全独立的工作单元中运行。 如果启用“ shareUnitOfWork”选项(在收件人列表上),则应传播异常。