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);
}
}
}