文件支持
Spring Integration 的文件支持扩展了 Spring Integration 核心,提供了一套专门的词汇来处理文件的读取、写入和转换。
此依赖项为项目所需:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-file</artifactId>
<version>7.0.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-file:7.0.2"
它提供了一个命名空间,支持定义专用于文件的通道适配器元素,并支持将文件内容读取为字符串或字节数组的转换器。
本节将解释 FileReadingMessageSource 和 FileWritingMessageHandler 的工作原理,以及如何将它们配置为 Bean。同时,还将讨论通过 Transformer 的文件特定实现来处理文件的支持。最后,将解释文件特定的命名空间。
章节总结
📄️ 读取文件
FileReadingMessageSource 可用于从文件系统消费文件。这是一个 MessageSource 的实现,它从文件系统目录创建消息。以下示例展示了如何配置 FileReadingMessageSource:
📄️ 写入文件
要将消息写入文件系统,您可以使用 FileWritingMessageHandler。该类可以处理以下负载类型:
📄️ 文件转换器
要将从文件系统读取的数据转换为对象,反之亦然,您需要做一些工作。与 FileReadingMessageSource 以及程度较轻的 FileWritingMessageHandler 不同,您可能需要自己的机制来完成这项工作。为此,您可以实现 Transformer 接口。或者,对于入站消息,您可以扩展 AbstractFilePayloadTransformer。Spring Integration 提供了一些现成的实现。
📄️ 文件分割器
FileSplitter 在 4.1.2 版本中被添加,其命名空间支持在 4.2 版本中添加。FileSplitter 基于 BufferedReader.readLine() 将文本文件分割成单独的行。默认情况下,拆分器使用迭代器从文件中读取行时,每次逐行发出。将 iterator 属性设置为 false 会导致它在将所有行读入内存后,再将它们作为消息发出。这样做的一个用例可能是,在发送任何包含行的消息之前,您希望检测文件上的 I/O 错误。然而,这只适用于相对较短的文件。
📄️ 文件聚合器
从版本 5.5 开始,引入了 FileAggregator,用于覆盖在启用 START/END 标记时 FileSplitter 的另一使用场景。为方便起见,FileAggregator 实现了全部三种序列详情策略:
📄️ 远程持久文件列表过滤器
默认情况下,入站和流式入站远程文件通道适配器(FTP、SFTP 及其他技术)配置了 AbstractPersistentAcceptOnceFileListFilter 的相应实现,并配置了内存中的 MetadataStore。要在集群中运行,可以使用共享 MetadataStore 的过滤器来替换这些过滤器(更多信息请参阅元数据存储)。这些过滤器用于防止多次获取同一文件(除非其修改时间发生变化)。从版本 5.2 开始,文件在获取之前会立即添加到过滤器中(如果获取失败,则会撤销此操作)。