Apache Camel:如何在Split的Choice中终止REST路由并返回结果
解决方案
1. 终止路由并返回错误响应
在Choice的错误分支中,结合stop()和endRest()就能实现终止路由并返回当前错误Body:
stop():停止Split中后续分片的处理,避免继续遍历其他消息endRest():直接终止REST路由,将当前Body作为响应返回
调整后的错误分支代码:
.when(simple("${body.errorOccurred} == true")) // 确保返回当前错误的Body(如需格式化可在此处额外处理) .setBody(simple("${body}")) .stop() .endRest()
2. 修正end()的使用问题
你遇到的Split加.end()导致Spring启动失败,是路由嵌套层级错误导致的:
- 每个
split()必须对应一个.end()闭合,但要注意和前后路由节点的层级关系 - 原路由末尾多余的
.end()需要移除(from()开头的路由无需额外闭合.end())
修正后的完整路由结构示例:
... .from("rest:post/your-api-path") .multicast(new GroupedMessageAggregationStrategy()) .parallelProcessing() .to("direct:getAndSaveRoute1") .to("direct:getAndSaveRoute2") .end() // 闭合multicast .split(body()) .choice() .when(simple("${body.errorOccurred} == true")) .setBody(simple("${body}")) .stop() .endRest() .endChoice() .otherwise() .log("Processing normal message: ${body}") .endChoice() .end() // 闭合choice .end() // 闭合split // 仅当所有Split分片都无错误时,才会执行到此处 .to("direct:nextRoute");
关键说明
- 如果你的路由不是REST类型(比如普通消息路由),无需
endRest(),改用stop()结合markRollbackOnly()即可终止流程 Split的stop()仅终止当前分片迭代,endRest()才会直接向客户端返回响应,二者结合才能满足你的需求
内容的提问来源于stack exchange,提问作者Snappawapa
相关产品推荐
相关产品推荐

