Spring Boot下Apache Camel路由组件启动时的参数化配置方法咨询
解决方案
核心思路:不需要给RouteBuilder实现类加@Component注解让Spring自动实例化,改为手动构造多个带不同参数的实例注册为Spring Bean即可,Apache Camel的Spring Boot自动配置会自动识别所有RouteBuilder类型的Bean,加载对应路由。
步骤1:改造RouteBuilder类
去掉类上的@Component注解,新增构造方法传入差异化参数:
// 移除@Component注解,避免Spring自动实例化单个对象 public class Route_ARCHIVE_REST extends RouteBuilder { private final String _deviceName; private final String _deviceProperty; Set<String> _batchBuffer = new HashSet<>(); int _batchBufferLimit = 10; // 新增构造方法传入差异化参数 public Route_ARCHIVE_REST(String deviceName, String deviceProperty) { this._deviceName = deviceName; this._deviceProperty = deviceProperty; } @Override public void configure() throws Exception { // timer名称加上设备参数后缀,保证不同路由的触发器ID唯一 from(String.format("timer:mytimer-%s-%s?repeatCount=1", _deviceName, _deviceProperty)) .setBody(simple("${null}")) .setHeader(Exchange.CONTENT_TYPE, simple("text/event-stream")) .setHeader("CamelHttpMethod", simple("GET")) .to("myUrl/" + _deviceName + "::" + _deviceProperty + "?disableStreamCache=true" ) .process(data -> { // 原有处理逻辑 }) .log("${body}") .to(toEndpoint); } }
步骤2:注册多实例路由
方案A:通过配置文件批量加载(推荐)
在application.yml中配置所有设备参数:
device: configs: - name: device01 property: prop01 - name: device02 property: prop02 - name: device03 property: prop03
新增配置类读取配置,批量注册路由实例:
@Configuration @ConfigurationProperties(prefix = "device") public class DeviceRouteConfig { private List<DeviceConfig> configs; public List<DeviceConfig> getConfigs() { return configs; } public void setConfigs(List<DeviceConfig> configs) { this.configs = configs; } public static class DeviceConfig { private String name; private String property; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } } // 批量注册RouteBuilder实例为Spring Bean @Bean public List<Route_ARCHIVE_REST> deviceRoutes() { return configs.stream() .map(config -> new Route_ARCHIVE_REST(config.getName(), config.getProperty())) .toList(); } }
方案B:硬编码注册(适合参数少的场景)
如果参数不多,可以直接手动创建实例注册:
@Configuration public class DeviceRouteConfig { @Bean public Route_ARCHIVE_REST route1() { return new Route_ARCHIVE_REST("device01", "prop01"); } @Bean public Route_ARCHIVE_REST route2() { return new Route_ARCHIVE_REST("device02", "prop02"); } }
注意事项
- 路由的起始端点ID需要唯一,示例中给timer名称加上了设备参数后缀,避免多个路由共用同一个触发器
- 每个
Route_ARCHIVE_REST实例的类属性都是独立的,不会出现多路由共享变量的线程安全问题 - 后续新增路由只需要在配置文件中新增对应设备配置即可,无需修改业务代码
内容的提问来源于stack exchange,提问作者WolfiG
相关产品推荐
相关产品推荐

