使用Apache Camel的File组件
File组件是什么?
文件组件是用于访问文件系统的组件,可以实现对文件和目录的输入输出。
消费者/生产者 zhě/ zhě)
File组件可以同时扮演消费者和生产者的角色。作为消费者,它可以读取文件目录,移动或删除已读取的文件。作为生产者,它可以写入文件等操作。
在消费者/生产者模式中,可以实现以下示例。
消费者
– 读取指定目录中的文件
– 读取指定文件路径的文件
– 删除指定文件路径的文件
– 读取满足条件的文件
制作公司
– 在指定路径下创建文件
– 在指定路径下创建文件,并在创建完成后生成一个[文件名].done的文件。
组件的URI
使用File组件的URI如下所示。
file:directoryName
在指定的目录中(directoryName),设置处理目标目录。
File组件将访问指定的directoryName中存在的文件并进行处理。
通过在该上下文路径中指定选项,可以执行各种处理。
File组件有很多选项,每个选项的说明都在以下官方网站中提供。
我在这篇文章中想要展示一些实施例并解释一些选项。
实施案例
本节将通过使用Java DSL中的路由描述来给出File组件的实例实现。我们仅限制在经常使用的选项上,并且对所列出的选项也只进行了概述,请参考前述官方网站上的File组件说明以获取详细信息。
将指定目录中的文件复制
这是一个用于复制指定目录文件的根目录。
将data/input目录中的所有文件复制到data/output目录。
通过指定noop=true选项,可以使其只读,不会移动或删除data/input目录中的文件。
同时,通过指定noop=true选项,也会自动启用idempotent=true选项,以确保相同的文件不会被处理。
from("file:data/input?noop=true").to("file:data/output");
将指定目录中的文件移动
这是指定目录下文件的移动路径。
将data/input目录中的所有文件移动到data/output。
通过delete=true,在处理后删除文件。
from("file:data/input?delete=true").to("file:data/output");
将指定目录中的文件进行递归移动。
这是一个用于移动指定目录下的文件的根目录,包括子目录中存在的文件。子目录本身不会被移动。
通过设置recursive=true来指定进行递归处理。
from("file:data/input?delete=true&recursive=true").to("file:data/output");
在处理完成之后创建一个名为 “done” 的文件。
复制指定目录中的文件,并在处理完成后创建一个名为[文件名].done的文件作为根目录。
当将所有文件成功复制到/data/output目录后,将在目标目录中生成一个名为[文件名].done的文件。
${file:name}表示正在处理的文件名。
from("file:data/input?noop=true").to("file:data/output?doneFileName=${file:name}.done");
如果存在名为[文件名].done的文件,则将文件移动。
如果存在一个名为 [文件名].done 的文件,我们将把文件移动走,与先前的情况相反。
from("file:data/output?noop=true&doneFileName=${file:name}.done").to("file:data/output.done");
获取文件名列表和文本文件的内容。
读取data/input文件夹中的文件,并获取文件名列表和文本文件的内容进行输出。在process方法中指定了FileListProcessor处理器。
from("file:data/input?noop=true").process(new FileListProcessor());
FileListProcessor处理器的内容如下所示。
package example.camelbegginer.file;
import java.util.Map;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class FileListProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
System.out.println("body: " + body);
Map<String, Object> headers = exchange.getIn().getHeaders();
System.out.println("fileName: " + headers.get("CamelFileAbsolutePath"));
}
}
在process方法中,通过以下代码将文件的内容输出到标准输出。
String body = exchange.getIn().getBody(String.class);
System.out.println("body: " + body);
文件名等文件信息将包含在消息头部。
下面是获取消息头部并通过”CamelFileAbsolutePath”获取文件路径,并将其输出到标准输出。
Map<String, Object> headers = exchange.getIn().getHeaders();
System.out.println("fileName: " + headers.get("CamelFileAbsolutePath"));
请参考以下页面以了解在消息头中要输入的值:
https://github.com/apache/camel/blob/master/components/camel-file/src/main/docs/file-component.adoc#message-headers
除了文件路径,你还可以获取文件大小、最后更新日期等信息。
只处理包含指定字符串的文件名的文件。
只处理文件名包含指定字符串的文件的路径。
使用filterFile选项来描述如下。
from("file:data/input?noop=true&filterFile=$simple{file:name} contains 'file1'")
.to("file:data/output");
筛选文件= $simple{file:name} 包含 ‘file1’
上面的filterFile选项的值表示包含文件名中的”file1″字符串的情况。
可以使用”Simple Expression Language”(简单表达式语言)和File Language来指定filterFile选项的值。
Simple式言语是Apache Camel的专有表达式语言,用于计算和输出变量的结果,并以$simple{变量}的方式进行编写。
使用Simple表达式语言,可以实现大多数计算和变量的参考。
此外,File Language是Simple式语言的扩展,可以引用与文件相关的值。
在前面的例子中,“file:name”表示对文件名的参考的File Language,而整个“$simple{file:name} contains ‘file1’”则是在Simple式语言中表示如果文件名中包含字符串“file1”的情况。
请参考以下官方网站了解Simple语言和File Language的详细信息。
-
- Simple Expression Language
- File Language(Apache Camel公式)
将指定的文件压缩成zip格式。
为了让您理解Apache Camel的便利之处,尽管它与File组件有些不相关,我将解释如何使用zip组件进行文件压缩。
如果要将file1.txt文件进行压缩,只需使用以下路由即可轻松实现。
from("file:data/input?noop=true&fileName=file1.txt")
.marshal().zipFile()
.to("file:data/output");
提示的「zipFile()」函数需要添加以下依赖关系才能使用。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-zipfile</artifactId>
<version>${camel.version}</version>
</dependency>
只需要一种选择: 参考资料
-
- File Component(Apache Camel公式)
Simple Expression Language(Simple式言語)
Simple式言語のCamel公式のマニュアルです。
File Language(Apache Camel公式)
File LanguageのCamel公式のマニュアルです。