使用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公式のマニュアルです。

广告
将在 10 秒后关闭
bannerAds