使用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
相关产品推荐
相关产品推荐

