Zip 支持
这个 Spring Integration 模块提供了 Zip (解)压缩支持。压缩算法的实现基于 ZeroTurnaround ZIP 库。提供了以下组件:
项目需要此依赖项
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-zip</artifactId>
<version>7.0.0</version>
</dependency>
compile "org.springframework.integration:spring-integration-zip:7.0.0"
命名空间支持
Spring Integration Zip 模块中的所有组件都提供命名空间支持。为了启用命名空间支持,你需要导入 Spring Integration Zip 模块的模式。以下示例展示了一个典型的设置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-zip="http://www.springframework.org/schema/integration/zip"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
https://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/zip
https://www.springframework.org/schema/integration/zip/spring-integration-zip.xsd">
</beans>
(解)Zip 转换器
ZipTransformer 为以下类型的输入 payload 实现了压缩功能:File、String、byte[] 和 Iterable。输入数据类型可以作为 Iterable 的一部分进行混合。例如,压缩包含字符串、字节数组和文件的集合应该很容易。需要注意的是,目前**不支持**嵌套的 Iterables。
ZipTransformer 可以通过设置以下几个属性进行定制:
-
compressionLevel- 设置压缩级别。默认为Deflater#DEFAULT_COMPRESSION。 -
useFileAttributes- 指定是否使用文件名作为 zip 条目。 -
fileNameGenerator- 用于根据请求消息生成原始文件名。默认为DefaultFileNameGenerator。.zip扩展名会添加到此名称中作为目标 zip 文件名,除非此生成器已经包含它。
此外,可以提供 ZipHeaders.ZIP_ENTRY_FILE_NAME 和 ZipHeaders.ZIP_ENTRY_LAST_MODIFIED_DATE 来指定 zip 条目的名称及其 lastmodified 属性。如果未提供,条目名称将是 fileNameGenerator 的确切结果,lastmodified 将回退到当前日期和时间。如果请求消息的 payload 是 Iterable,则此条目名称将以从 1 开始的索引进行修改。
例如,要将一个简单的 test.txt 文件压缩成 test.txt.zip,只需以下配置即可:
-
Java DSL
-
Kotlin DSL
-
Groovy DSL
-
Java
-
XML
@Bean
public IntegrationFlow zipFlow() {
return IntegrationFlow
.from("zipChannel")
.transform(new ZipTransformer())
.get();
}
@Bean
fun zipFlow() =
integrationFlow("zipChannel") {
transform(ZipTransformer())
}
@Bean
zipFlow() {
integrationFlow 'zipChannel',
{
transform new ZipTransformer()
}
}
@Transformer(inputChannel = "zipChannel")
@Bean
ZipTransformer zipTransformer() {
return new ZipTransformer();
}
<int-zip:zip-transformer input-channel="zipChannel"/>
有关更多信息,请参阅 ZipTransformer Javadoc。
UnZipTransformer 支持以下输入 payload 类型:File、byte[] 和 InputStream。解压数据时,可以指定 expectSingleResult 属性。如果设置为 true 且检测到超过 1 个 zip 条目,则会抛出 MessagingException。此属性还会影响 payload 的返回类型。如果设置为 false(默认值),则 payload 将为 SortedMap 类型;如果设置为 true,则返回实际的 zip 条目。
可以在 UnZipTransformer 上设置的其他属性:
-
deleteFiles- 如果 payload 是File的实例,此属性指定转换后是否删除文件。默认为false。 -
ZipResultType- 定义转换后返回数据的格式。可用选项有:File、byte[]。 -
workDirectory- 当ZipResultType设置为ZipResultType.FILE时使用工作目录。默认情况下,此属性设置为包含子目录ziptransformer的系统临时目录。
例如,要将一个简单的 test.zip 文件解压缩为条目映射,只需以下配置即可:
-
Java DSL
-
Kotlin DSL
-
Groovy DSL
-
Java
-
XML
@Bean
public IntegrationFlow unzipFlow() {
return IntegrationFlow
.from("unzipChannel")
.transform(new UnZipTransformer())
.get();
}
@Bean
fun unzipFlow() =
integrationFlow("unzipChannel") {
transform(UnZipTransformer())
}
@Bean
unzipFlow() {
integrationFlow 'unzipChannel',
{
transform new UnZipTransformer()
}
}
@Transformer(inputChannel = "unzipChannel")
@Bean
UnZipTransformer unzipTransformer() {
return new UnZipTransformer();
}
<int-zip:unzip-transformer input-channel="unzipChannel"/>
解压拆分器
当 zip 文件包含多个条目时,UnZipResultSplitter 会很有用。它本质上必须作为集成流中的下一步使用,在上面提到的 UnZipTransformer 之后。它只支持 Map 作为输入数据,并将每个条目发送到 outputChannel,并带有 FileHeaders.FILENAME 和 ZipHeaders.ZIP_ENTRY_PATH 头。
以下示例演示了一个用于拆分解压结果的简单配置:
-
Java DSL
-
Kotlin DSL
-
Groovy DSL
-
Java
-
XML
@Bean
public IntegrationFlow unzipSplitFlow(Executor executor) {
return IntegrationFlow
.from("unzipChannel")
.transform(new UnZipTransformer())
.split(new UnZipResultSplitter())
.channel(c -> c.executor("entriesChannel", executor))
.get();
}
@Bean
fun unzipFlow(executor: Executor) =
integrationFlow("unzipChannel") {
transform(UnZipTransformer())
split(UnZipResultSplitter())
channel { executor("entriesChannel", executor) }
}
@Bean
unzipFlow(Executor executor) {
integrationFlow 'unzipChannel',
{
transformWith {
ref new UnZipTransformer()
}
splitWith {
ref new UnZipResultSplitter()
}
channel { executor 'entriesChannel', executor }
}
}
@Transformer(inputChannel = "unzipChannel", outputChannel = "splitChannel")
@Bean
UnZipTransformer unzipTransformer() {
return new UnZipTransformer();
}
@Spitter(inputChannel = "splitChannel", outputChannel = "entriesChannel")
@Bean
UnZipResultSplitter unZipSplitter() {
return new UnZipResultSplitter();
}
@Bean
ExecutorChannel entriesChannel(Executor executor) {
return new ExecutorChannel(executor);
}
<int:chain input-channel="unzipChannel" output-channel="entriesChannel">
<int-zip:unzip-transformer/>
<int:splitter>
<bean class="org.springframework.integration.zip.splitter.UnZipResultSplitter"/>
</int:splitter>
</int:chain>
<int:channel id="entriesChannel">
<int:dispatcher task-executor="executor"/>
</int:channel>