You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:20:27