Apache Camel路由模板实例化时聚合完成大小表达式取值异常问询
问题分析与解决方案
核心结论
这个问题主要是Apache Camel 3.20.x版本中路由模板启动时表达式缓存的隔离缺陷,你的基础用法没有问题,同时可以通过升级版本或切换templateBeans来解决。
具体分析
用法合规性确认
你使用常量作为模板参数键、通过templateParameterExpression引用参数的方式是符合官方规范的,其他表达式正常也证明了这一点。问题出在聚合节点的completionSize是路由启动阶段就会求值的配置项,Camel对这类表达式的缓存没有按路由实例做隔离,导致后启动的路由复用了前一个路由的缓存值。框架Bug的可能性
Camel 3.20.x属于旧维护分支,在后续的3.x补丁版本(如3.20.9)以及4.x主版本中,官方优化了路由模板的参数隔离机制,修复了这类跨路由缓存串值的问题。建议优先尝试升级到同分支的最新维护版本,验证是否解决问题。替代方案:改用templateBeans
如果暂时无法升级,切换到templateBeans是可靠的解决办法。将模板参数封装到独立Bean中,通过方法调用获取completionSize值,每个路由实例会绑定专属的Bean实例,彻底避免缓存污染:// 定义模板参数Bean public class RouteTemplateParams { private int fileCorrelationCompletionSize; public int getFileCorrelationCompletionSize() { return fileCorrelationCompletionSize; } public void setFileCorrelationCompletionSize(int fileCorrelationCompletionSize) { this.fileCorrelationCompletionSize = fileCorrelationCompletionSize; } } // 路由模板中配置聚合节点 .aggregate(header("correlationId")) .completionSize(method(RouteTemplateParams.class, "getFileCorrelationCompletionSize")) // 其他聚合配置临时规避方案
若不想切换templateBeans,可以尝试用simple表达式直接引用模板参数,明确指定参数路径,绕过全局缓存:.completionSize(simple("${templateParameters." + RouteTemplateConstants.TEMPLATE_PARAMETER_FILE_CORRELATION_COMPLETION_SIZE + "}"))这种方式让每个路由的表达式引用路径更明确,避免Camel误命中其他路由的缓存值。
内容的提问来源于stack exchange,提问作者Nemo84
相关产品推荐
相关产品推荐

