如何在Apache骆驼路线中提及动态目录路径

时间:2018-08-17 19:42:36

标签: java routing apache-camel

我正在尝试从不同目录中获取文件。例如,我有以下目录Structure

vendors/dir1/files/heelo.txt
vendors/dir2/files/hello2.txt

在此有3个目录:

1.vendors
2.dir1和dir2
3.文件

由于2. dir1和dir2不同,所以我必须动态地使用它。

我写了以下代码:

<routes xmlns="http://camel.apache.org/schema/spring"> 
<route id="com.performancebikes.Inventory1" autoStartup="false"> 
<from uri="b2bmbFileSystem://com.a/vendors/${file:name}/files"/>
<to uri="b2bmbMailBox://com.b/Files"/>
</route> 
</routes>

由于该目录${file:name}无法正常工作,请帮助我解决此问题

1 个答案:

答案 0 :(得分:1)

如果您要使用vendors下的每个文件,则可以递归使用文件:

<from uri="b2bmbFileSystem://com.a/vendors/?recursive=true"/>
<to uri="b2bmbMailBox://com.b/Files"/>

如果使用文件vendors/dir2/files/hello2.txt,则输出文件将保存在com.b/Files/dir2/files/hello2.txt下,因此它重新创建与源文件系统中相同的相对路径

如果您不想重新创建相同的结构,请可以展平输出结构

<from uri="b2bmbFileSystem://com.a/vendors/?recursive=true"/>
<to uri="b2bmbMailBox://com.b/Files?flatten=true"/>

冒着相同的文件名出现在多个子目录中的风险,因此在目标文件夹中会有冲突。

如果您只想从两个特定目录中使用 ,则只需创建两个路由:

<from uri="b2bmbFileSystem://com.a/vendors/dir1/files/"/>
<to uri="b2bmbMailBox://com.b/Files"/>

<from uri="b2bmbFileSystem://com.a/vendors/dir2/files/"/>
<to uri="b2bmbMailBox://com.b/Files"/>

只要路由中不包含也会相乘的处理逻辑,则多个路由就没有问题。

即使您具有处理逻辑,也可以像上面那样编写简单的“文件收集器路由”,然后构建一个占用所有文件收集目录的路由,并在该路由中实现逻辑。

如果您要从许多特定目录中消费,则可以在应用程序中注入一个路由配置列表。例如,YAML格式的路由配置如下所示:

fileConsumer:
  routes:
    - routeId: "consumer1"
      source: "/path/to/source/directory"
      target: "/path/to/target/directory"
    - routeId: "consumer2"
      source: "/path/to/other/source/directory"
      target: "/path/to/other/target/directory"

如果将其作为List<RouteConfiguration>注入,则可以在RouteBuilder类中对其进行迭代以创建所有已配置的路由:

@Override
public void configure() {
    configuration.getRoutes().forEach(this::addRouteToContext);
}

private void addRouteToContext(final RouteConfiguration routeConfiguration) throws Exception {
    String fileReaderSourceUri = [build complete endpoint URI from directory];
    String fileReaderTargetUri = [build complete endpoint URI from directory];

    this.camelContext.addRoutes(new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from(fileReaderSourceUri)
            .routeId(routeConfiguration.getRouteId())
            .to(fileReaderTargetUri);
        }
    }
}