Java 如何在Apache camel路由中提及动态目录路径

Java 如何在Apache camel路由中提及动态目录路径,java,routing,apache-camel,Java,Routing,Apache Camel,我正在尝试从不同的目录中获取文件。例如,我有以下目录结构 vendors/dir1/files/heelo.txt vendors/dir2/files/hello2.txt 其中有3个目录: 1.供应商 2.dir1和dir2 3.文件 从2号开始。dir1和dir2是不同的,所以我必须动态地接受它 我编写了以下代码: <routes xmlns="http://camel.apache.org/schema/spring"> <route id="com.performa

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

vendors/dir1/files/heelo.txt

vendors/dir2/files/hello2.txt

其中有3个目录:

1.供应商
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}
不起作用,请帮助我解决此问题如果您想使用
供应商下的每个文件
,您可以递归使用文件

<from uri="b2bmbFileSystem://com.a/vendors/?recursive=true"/>
<to uri="b2bmbMailBox://com.b/Files"/>
<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"/>
如果将其作为
List
注入,则可以在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);
        }
    }
}

谢谢你的详细解释。我需要使用名为vendors目录下许多不同目录中的文件。但是我没有得到迭代路由子目录的逻辑,你能给我syantax吗?我用一个基于配置的动态路由创建的简化示例扩展了我的答案
@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);
        }
    }
}