当前位置: 首页 > 知识库问答 >
问题:

使用属性文件中配置的endpoint在运行时添加骆驼路由

晁文斌
2023-03-14

我拥有一个spring应用程序,希望在应用程序启动期间动态添加骆驼路由。endpoint在属性文件中配置,并在运行时加载。使用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:在:at:>>>onException[[class org.apache.camel.component.file.GenericFileOperationFailedException]->[log[Exception trap${Exception.class}],processor[processor@0x0]]]<<<<在route:route(File_routeDirection:)[[from[direction:...]中,因为必须在:processor[processor@0x0]\n\ta上指定ref

不确定--有什么问题?有没有人能对此有什么建议或解决办法。谢谢

共有1个答案

柴宏阔
2023-03-14

要在迭代中创建路由,最好有一个对象为一条路由保存不同的值。让我们将其称为routeConfiguration,这是一个简单的POJO,具有用于fromtorouteID的字符串字段。

我们使用YAML文件来配置这些东西,因为您有一个真正的列表格式,而不是在属性文件中使用“平面列表”(路由[0].from,路由[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());
        }
    });
}
 类似资料:
  • 如何在Java的运行时添加骆驼路线?我找到了一个Grails示例,但我已经在Java实现了它。 我的应用程序上下文。xml已经有一些预定义的静态路由,我想在运行时向它添加一些动态路由。可能吗?因为包含动态路由的唯一方法是编写路由。然后将路由定义加载到上下文。它将如何在现有的静态路由上工作?运行时路由

  • 我是个新手 我想构建一个通用API,其中路由信息以xml格式在数据库中可用(信息来自web应用程序)。 现在另一个Web应用程序做了一些事件,然后路由信息ID传递到这个通用的API,然后它创建路由和进程给响应回Web应用程序(我认为这是基于事件的路由纠正我,如果我错了)。 如何使用 建议一些链接或举例如何从这里开始? 我对Camel有基本的了解(在独立应用程序中使用文件、jdbc、cxf组件)。

  • 问题内容: 是否可以创建新的属性文件并在运行时添加键和值?我想在安装我的应用程序时根据用户输入将新的密钥添加到属性文件。我签出了Java Properties类,但是它似乎可以将值设置为现有键,但是不能将新键添加到属性文件中。 问题答案: 您可以仅通过使用当前不存在的键进行调用来添加新属性。不过,这只会在内存中执行-您将不得不再次调用以将更改反映回文件:

  • 我正试图在GAE上开始一条骆驼路线,但却撞上了一堵又一堵砖墙。首先,我尝试了如下路线: 但那什么都起不到作用。由于对Camel和GAE都是新手,我怀疑这是因为组件在路由开始时不充当使用者。然后我试着启动计时器: 却从GAE中得到了一个严重的错误: 错误:拒绝访问(java.lang.RuntimePermission modifyThreadGroup) 事实证明,您不能在GAE上创建新的实例,而

  • 问题内容: 是否可以向可运行的jar文件的类路径中添加一些属性文件?我尝试了以下解决方案: 使用以下命令运行可执行文件: java -cp ../prop_dir/prop1.properties;../prop_dir/prop2.properties -jar MyRunnableJar.jar 添加到清单文件中(在“类路径”部分中) ../prop_dir/prop1.properties

  • 我通过以下代码以编程方式创建JMS路由: 我有课: 我想在上述路由和endpoint之间交换一些信息/参数。根据我想要的参数值,选择要在这个消息侦听器容器中设置的连接工厂。 请让我知道我是否能够解释我的问题陈述。 还有其他方法可以实现这一点吗?我想在运行时构建连接工厂,路由也是如此。JmsEndpoint 中是否有任何方法可以用来了解路由 id?