我想将聚合结果作为路由的主要消息,而不是IN上的原始消息。 我也想用一条路线做到这一点。
我知道我可以在聚合后使用.to("direct:one_result")
,但是我在一条路由中执行此操作有一个严格的限制,因为我是动态生成路由的。
我的.to("mock:out")
将被更长的路由定义所取代。
from("direct:in").routeId("TEST_AGGREGATION_ROUTE")
.log("<IN> ${body}")
.aggregate(header("THE_ID"), (oldExchange, newExchange) -> {
final List<Object> body;
final Exchange outExchange;
if (oldExchange == null) {
outExchange = newExchange;
body = new ArrayList<>();
body.add(newExchange.getIn().getBody());
} else {
outExchange = oldExchange;
body = oldExchange.getIn().getBody(List.class);
body.add(newExchange.getIn().getBody());
}
outExchange.getIn().setBody(body);
return outExchange;
})
.completionSize(4)
.completionTimeout(30000)
.log("<AGGREGATION> size = ${body.size}") // HERE I GET THE AGGREGATION RESULT
.end()
.log("<OUT> ${body}") // HERE I GET THE INPUT MESSAGES
.to("mock:out")
;
测试输出如下:
TEST_AGGREGATION_ROUTE - <IN> BODY1
TEST_AGGREGATION_ROUTE - <OUT> BODY1
TEST_AGGREGATION_ROUTE - <IN> BODY2
TEST_AGGREGATION_ROUTE - <OUT> BODY2
TEST_AGGREGATION_ROUTE - <IN> BODY3
TEST_AGGREGATION_ROUTE - <OUT> BODY3
TEST_AGGREGATION_ROUTE - <IN> BODY4
TEST_AGGREGATION_ROUTE - <AGGREGATION> size = 4
TEST_AGGREGATION_ROUTE - <OUT> BODY4
答案 0 :(得分:0)
您的路由有误。您不应该在子路由中“在循环外”处理聚合的最终结果。不要在end()之后放置任何语句。
from("direct:in")
...
.aggregate(header("THE_ID"), (oldExchange, newExchange) -> {...})
.completionSize(4)
.completionTimeout(30000)
.to("direct:processAggregation")
.end();
from("direct:processAggregation")
.log("<AGGREGATION> size = ${body.size}")
.log("<OUT> ${body}");
一旦聚合达到其完成大小,整个聚合将被发送到首先下一个“ to(...)”终结点。因此,您应该对每个集合进行的操作应以分开的路径建模。