gpt4 book ai didi

java - 如何在 Apache Camel 路由中提及动态目录路径

转载 作者:行者123 更新时间:2023-12-02 10:54:15 25 4
gpt4 key购买 nike

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

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}无法正常工作,请帮我解决这个问题

最佳答案

如果您想使用 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"/>

只要路由不包含同样相乘的处理逻辑,拥有多个路由就没有问题。

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

如果您想从许多特定目录中使用,您可以在应用程序中注入(inject)路由配置列表。 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"

如果您将其注入(inject)为 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);
}
}
}

关于java - 如何在 Apache Camel 路由中提及动态目录路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com