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

Quarkus Camel:Camel 3中如何Mock路由返回值?

在Camel 3中实现路由替换(替代Camel 2的Mock/Advice功能)

问题说明

Camel 2里通过getRouteDefinition获取路由定义、再用adviceWith替换指定节点的方案,在Camel 3中行不通:

  • 无法从CamelContext直接获取RouteDefinition
  • Route对象没有adviceWith方法
  • 使用AdviceWith.adviceWith的lambda形式时,无法调用constant这类RouteBuilder内置方法

需求是替换路由中的指定节点(或整个路由),避免执行原逻辑。

原路由代码

from("direct:someRoute")
    .id("someRoute")
    .log(...)
    .toD("http://some.call.com/request")
    .id("someCall")
    .log(...)
    .end();

Camel 3的解决方案

Camel 3调整了AdviceWith的API,改用静态方法结合AdviceWithRouteBuilder匿名类实现,这样就能正常使用RouteBuilder的所有方法:

替换单个节点

String targetRouteId = "someRoute";

AdviceWith.adviceWith(camelContext, targetRouteId, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception {
        // 匹配ID为someCall的节点,替换为自定义逻辑
        weaveById("someCall")
            .replace()
            .setBody(constant("{}"));
    }
});

camelContext.start();

完全替换整个路由

如果需要完全跳过原路由逻辑,直接替换为自定义路由:

AdviceWith.adviceWith(camelContext, targetRouteId, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception {
        // 替换路由的起始端点,原路由不再触发
        replaceRouteFromWith("direct:someRoute", "direct:mockRoute");
        
        // 定义新的路由逻辑
        from("direct:mockRoute")
            .setBody(constant("{}"))
            .log("执行Mock路由逻辑");
    }
});

关键注意点

  • AdviceWith的配置必须在CamelContext启动前执行,否则不会生效
  • 不要用lambda表达式代替AdviceWithRouteBuilder匿名类——lambda无法继承RouteBuilder的方法,导致constant等方法不可用

内容的提问来源于stack exchange,提问作者Snappawapa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:27:21