'filterDirectory' 的 Camel File 组件有什么作用?
What 'filterDirectory' of Camel File component does?
我想知道 Camel 文件组件中 'filterDirectory' 参数的用途是什么。我没能找到任何关于这个 属性 的例子。根据 docs:
Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}.
我写了一些示例路由来检查它的行为:
public class FilterDirectoryRoute extends RouteBuilder {
private static final String FILE = "file:";
private static final String START_DIR = "C:/test/camel/filterDirectoryRoute";
private final Map<String, String> params = Map.of(
"noop", "true",
"recursive", "true",
"filterDirectory", "${date:now:yyyy/DDD}"
);
@Override
public void configure() {
from(FILE + START_DIR + fileParams(params))
.log(DEBUG, log, "date = ${date:now:yyyy/DDD}")
.log(DEBUG, log, "body = ${body}")
.end();
}
}
filterDirectoryRoute
目录有下一个结构:
filterDirectoryRoute
┣ 2020
┃ ┣ 1.txt
┃ ┣ 105.txt
┃ ┗ 15.txt
┗ 2021
┃ ┣ 268
┃ ┃ ┗ 268.txt
┃ ┣ 269
┃ ┃ ┗ 269.txt
┃ ┣ 270
┃ ┃ ┗ 270.txt
┃ ┣ 271
┃ ┃ ┗ 271.txt
┃ ┣ 272
┃ ┃ ┗ 272.txt
有了这样的配置,路由只是遍历目录中的所有文件并读取它。所以 filterDirectory
没有任何效果,因为它没有输入 2021/270
(270 是一年中的今天)。
如果我删除 recursive
参数,则不会处理任何文件,因为直接在起始目录中没有文件。
所以问题是:如何使用filterDirectory
选项及其作用?
在我看来,filterDirectory
查询参数与 File Language. 一起使用,这意味着您必须构建一个本质上会产生布尔结果的过滤器。类似于 filterDirectory="${file:name} == ${date:now:yyyy/DDD}"
.
注意:我自己还没有验证过。
编辑:我现在证实了我的直觉
以下有效且仅读取文件 2.txt
.
@Component
public class SampleFileRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("file://folder?recursive=true&filterDirectory=${file:name} == 2021")
.log("${header.CamelFileRelativePath}");
}
}
folder
┣ 2020
┃ ┣ 1.txt
┗ 2021
┃ ┣ 2.txt
我想知道 Camel 文件组件中 'filterDirectory' 参数的用途是什么。我没能找到任何关于这个 属性 的例子。根据 docs:
Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}.
我写了一些示例路由来检查它的行为:
public class FilterDirectoryRoute extends RouteBuilder {
private static final String FILE = "file:";
private static final String START_DIR = "C:/test/camel/filterDirectoryRoute";
private final Map<String, String> params = Map.of(
"noop", "true",
"recursive", "true",
"filterDirectory", "${date:now:yyyy/DDD}"
);
@Override
public void configure() {
from(FILE + START_DIR + fileParams(params))
.log(DEBUG, log, "date = ${date:now:yyyy/DDD}")
.log(DEBUG, log, "body = ${body}")
.end();
}
}
filterDirectoryRoute
目录有下一个结构:
filterDirectoryRoute
┣ 2020
┃ ┣ 1.txt
┃ ┣ 105.txt
┃ ┗ 15.txt
┗ 2021
┃ ┣ 268
┃ ┃ ┗ 268.txt
┃ ┣ 269
┃ ┃ ┗ 269.txt
┃ ┣ 270
┃ ┃ ┗ 270.txt
┃ ┣ 271
┃ ┃ ┗ 271.txt
┃ ┣ 272
┃ ┃ ┗ 272.txt
有了这样的配置,路由只是遍历目录中的所有文件并读取它。所以 filterDirectory
没有任何效果,因为它没有输入 2021/270
(270 是一年中的今天)。
如果我删除 recursive
参数,则不会处理任何文件,因为直接在起始目录中没有文件。
所以问题是:如何使用filterDirectory
选项及其作用?
在我看来,filterDirectory
查询参数与 File Language. 一起使用,这意味着您必须构建一个本质上会产生布尔结果的过滤器。类似于 filterDirectory="${file:name} == ${date:now:yyyy/DDD}"
.
注意:我自己还没有验证过。
编辑:我现在证实了我的直觉
以下有效且仅读取文件 2.txt
.
@Component
public class SampleFileRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("file://folder?recursive=true&filterDirectory=${file:name} == 2021")
.log("${header.CamelFileRelativePath}");
}
}
folder
┣ 2020
┃ ┣ 1.txt
┗ 2021
┃ ┣ 2.txt