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

使用Camel Filter时测试中无法访问路由元素的问题

Camel路由测试中Filter节点后续元素无法通过getOutputs()获取的原因

我定义了如下Camel路由:

from(source).routeId("source processor")       
                .filter(liabilityMessageFilter)
                .log(LoggingLevel.INFO, LOGGER, "Some log")
                .process("myMessageProcessor");

并编写了测试用例验证路由定义:

@Test
public void myTest() {
    ModelCamelContext mcc = camelContext.adapt(ModelCamelContext.class);
    final List<RouteDefinition> routeDefinitions = mcc.getRouteDefinitions();
    assertThat(((LogDefinition) routeDefinitions.get(0).getOutputs().get(1)).getMessage(), is("some log"));
}

问题在于:routeDefinitions.get(0).getOutputs()仅返回Filter对象,无法获取后续的Log和Process元素;但如果调换路由定义中Filter与Log的顺序,测试就能正常运行。请问这一现象的原因是什么?我是否存在操作错误?

例如:当路由中没有Filter时,routeDefinitions.get(0).getOutputs()可以正常返回Log和Process元素。


原因分析与解决方案

这是因为Camel中Filter是分支型处理器,其内部结构和Log、Process这类线性处理器不同:

  • 调用.filter()后,后续的.log()和.process()会被挂载到Filter节点的匹配成功分支下,而非作为RouteDefinition的直接输出节点存在。
  • 因此routeDefinitions.get(0).getOutputs()只会返回FilterDefinition对象,Log和Process定义需要从FilterDefinition的getOutputs()方法中获取。

你的操作存在认知误差:未理解Filter节点的嵌套结构,直接从RouteDefinition的根输出列表中查找后续节点,忽略了Filter的内部分支层级。

正确的测试代码示例:

@Test
public void myTest() {
    ModelCamelContext mcc = camelContext.adapt(ModelCamelContext.class);
    final List<RouteDefinition> routeDefinitions = mcc.getRouteDefinitions();
    // 获取Filter节点
    FilterDefinition filter = (FilterDefinition) routeDefinitions.get(0).getOutputs().get(0);
    // 从Filter的匹配分支中获取Log节点
    LogDefinition log = (LogDefinition) filter.getOutputs().get(0);
    assertThat(log.getMessage(), is("Some log"));
}

当调换Filter与Log的顺序时,Log成为RouteDefinition的直接输出节点,Filter挂载在Log之后,此时routeDefinitions.get(0).getOutputs()能直接拿到Log节点,因此测试可以正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:17:58