此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.4! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.4! |
这个 Spring 集成模块提供了 Zip(解)压缩支持。 压缩算法实现基于 ZeroTurnaround ZIP 库。 提供了以下组件:
您需要将此依赖项包含在您的项目中:
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-zip</artifactId>
<version>6.4.0-SNAPSHOT</version>
</dependency>
compile "org.springframework.integration:spring-integration-zip:6.4.0-SNAPSHOT"
Namespace 支持
Spring Integration Zip 模块中的所有组件都提供名称空间支持。 为了启用命名空间支持,您需要导入 Spring Integration Zip Module 的模式。 以下示例显示了一个典型的设置:
<?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 转换器
为以下类型的输入实现压缩功能 : , , 和 .
在输入数据类型中,可以作为 .
例如,压缩包含 Strings、byte 数组和 Files 的集合应该很容易。
需要注意的是,目前不支持嵌套的 Iterables。ZipTransformer
payload
File
String
byte[]
Iterable
Iterable
可以通过设置多个属性来自定义:ZipTransformer
-
compressionLevel
- 设置压缩级别。 默认值为 。Deflater#DEFAULT_COMPRESSION
-
useFileAttributes
- 指定文件名是否应用于 zip 条目。 -
fileNameGenerator
- 用于根据请求消息生成原始文件名。 默认为 。 扩展名将添加到目标 zip 文件名的此名称中。 除非它已经作为此生成器的结果存在。DefaultFileNameGenerator
.zip
此外,还可以为 zip 条目的名称及其属性提供 and。
如果未提供,则条目名称是 的确切结果,并回退到当前日期和时间。
如果请求消息的有效负载是 ,则此条目名称将修改为索引 。ZipHeaders.ZIP_ENTRY_FILE_NAME
ZipHeaders.ZIP_ENTRY_LAST_MODIFIED_DATE
lastmodified
fileNameGenerator
lastmodified
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"/>
有关更多信息,请参阅 Javadocs。ZipTransformer
An 支持以下输入 : , 和 。
解压缩数据时,可以指定一个属性。
如果设置为 并且检测到超过 zip 条目,则将引发 a。
此属性还会影响有效负载的返回类型。
如果设置为 (default),则有效负载将为 type , if ,但是,将返回实际的 zip 条目。UnZipTransformer
payload
File
byte[]
InputStream
expectSingleResult
true
1
MessagingException
false
SortedMap
true
可以在 上设置的其他属性 :UnZipTransformer
-
deleteFiles
- 如果有效负载是 的实例,则此属性指定是否在转换后删除 File。 默认值为 。File
false
-
ZipResultType
- 定义转换后返回的数据的格式。 可用选项包括: , .File
byte[]
-
workDirectory
- 当 a 设置为 时,将使用 work 目录。 默认情况下,此属性设置为 System temporary directory containing a subdirectory 。ZipResultType
ZipResultType.FILE
ziptransformer
例如,要将一个简单的文件压缩到其条目的 map 中,只需此配置就足够了: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"/>
解压缩的 Splitter
在 zip 文件包含多个条目的情况下,这很有用。
从本质上讲,它必须用作上述 之后集成流程的下一步 。
它仅支持 a 作为输入数据,并将每个条目发送到 with 和 标头中。UnZipResultSplitter
1
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>