Исключение из списка получателей EIP верблюда, не обнаруженного на уровне маршрута - PullRequest
0 голосов
/ 17 сентября 2018

верблюд версия 2.22.0 Время выполнения: SpringBoot: 2.0.2.RELEASE Версия JDK: 1.8.0_121

EIP: receientList.

Проблема: Возникло исключение из параллельного процесса receientList на уровне маршрута в предложении ExException.

ниже DSL

@ Override public void 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 голосов
/ 17 сентября 2018

Это классическая ошибка: (точно так же, как разделенный EIP) каждый получатель обработает копию оригинального Exchange. Любой сбой на этих копиях не повлияет (вызовет исключение) на обработку маршрута master Exchange, поскольку каждый отдельный обмен выполняется в совершенно отдельной единице работы. Если вы включите опцию «shareUnitOfWork» (в списке получателей), исключения должны распространяться.

0 голосов
/ 17 сентября 2018

Попробуйте сделать 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 (обычно не можете вставить образец кода)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...