我正在尝试从不同目录中获取文件。例如,我有以下目录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}
无法正常工作,请帮助我解决此问题
答案 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);
}
}
}