从Apache Camel 3迁移到4:移除adapt()后如何动态操作路由定义?
Apache Camel 4 动态路由操作实现方案(从Camel 3迁移)
问题背景
从Apache Camel 3升级到4版本后,CamelContext.adapt()方法被移除,无法再通过该方式获取ModelCamelContext实例来动态操作路由。官方迁移指南仅提示使用getCamelContextExtension替代,但未给出具体兼容实现。
以下是针对获取路由定义、移除路由、添加新路由、操作路由输出这几个需求的具体实现方式:
1. 获取路由定义
通过CamelContext获取ModelCamelContextExtension实例,替代原有的adapt()方式:
// 获取ModelCamelContextExtension ModelCamelContextExtension modelExtension = context.getCamelContextExtension(ModelCamelContextExtension.class); // 根据路由ID获取RouteDefinition RouteDefinition route = modelExtension.getRouteDefinition(routeId);
2. 从上下文移除路由
移除路由需要先停止目标路由,再通过扩展实例删除路由定义:
// 停止目标路由 context.stopRoute(routeId); // 移除路由定义 modelExtension.removeRouteDefinition(routeId); // 可选:彻底清理路由实例 context.removeRoute(routeId);
3. 添加新的路由定义
直接使用ModelCamelContextExtension的addRouteDefinition方法,添加后启动路由:
// 构建新的RouteDefinition RouteDefinition newRoute = new RouteDefinition(); newRoute.setId("new-route-id"); newRoute.from("direct:new-input") .to("log:new-route-log"); // 添加路由定义 modelExtension.addRouteDefinition(newRoute); // 启动新路由 context.startRoute("new-route-id");
4. 操作路由输出(调用getOutputs)
获取到RouteDefinition实例后,可直接调用getOutputs()方法操作其输出节点,用法和Camel 3一致:
// 获取路由的输出节点列表 List<ProcessorDefinition<?>> outputs = route.getOutputs(); // 对输出节点进行操作,比如添加新处理器 outputs.add(new ToDefinition("log:updated-output")); // 更新路由定义并重启路由使变更生效 modelExtension.updateRouteDefinition(routeId, route); context.stopRoute(routeId); context.startRoute(routeId);
注意:修改路由定义后,必须重启对应路由才能让变更生效。
内容的提问来源于stack exchange,提问作者JanM
相关产品推荐
相关产品推荐

