使用属性文件中配置的端点在运行时添加骆驼路线

时间:2018-12-02 10:20:15

标签: spring-boot apache-camel

我拥有一个spring应用程序,并希望在应用程序启动期间动态添加骆驼路线。端点在属性文件中配置并在运行时加载。 使用Java DSL,我正在使用for循环创建所有路由,

for(int i=0;i<allEndPoints;i++)
  {
  DynamcRouteBuilder route = new 
   DynamcRouteBuilder(context,fromUri,toUri) 
camelContext.addRoutes(route)

}
private class DynamcRouteBuilder extends RouteBuilder {
    private final String from;
    private final String to;

    private MyDynamcRouteBuilder(CamelContext context, String from, String to) {
        super(context);
        this.from = from;
        this.to = to;
    }

    @Override
    public void configure() throws Exception {
        from(from).to(to);
    }
}

但在创建第一条路线时会遇到异常

无法创建路由file_routedirect:位置:>>> OnException [[class org.apache.camel.component.file.GenericFileOperationFailedException]-> [Log [Exception trapped $ {exception.class}]],进程[Processor @ 0x0 ]]] <<<在路由中:Route(file_routedirect:)[[From [direct:...因为存在引用,必须在以下位置指定:process [Processor @ 0x0] \ n \ ta

不知道这是什么问题?有人对此有任何建议或解决办法吗?谢谢

1 个答案:

答案 0 :(得分:0)

好吧,要在迭代中创建路线,最好有一些对象保存一条路线的不同值。我们称之为RouteConfiguration,这是一个简单的POJO,其中包含fromtorouteId的String字段。

我们正在使用 YAML文件进行配置,因为您使用的是真实列表格式,而不是在属性文件中使用“平面列表”(route[0].fromroute[0].to)。

如果使用 Spring ,则可以使用@ConfigurationProperties

将这样的“对象配置列表”直接转换为对象集合

当您能够创建这样的值对象集合时,可以简单地对其进行迭代。这是一个非常简化的示例。

@Override
public void configure() {
    createConfiguredRoutes();
}

void createConfiguredRoutes() {
    configuration.getRoutes().forEach(this::addRouteToContext);
}

// Implement route that is added in an iteration
private void addRouteToContext(final RouteConfiguration routeConfiguration) throws Exception {
    this.camelContext.addRoutes(new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from(routeConfiguration.getFrom())
                .routeId(routeConfiguration.getRouteId())
                ...
                .to(routeConfiguration.getTo());
        }
    });
}