Zip Support

此 Spring 集成模块提供 Zip (解)压缩支持。压缩算法实现基于 ZeroTurnaround ZIP Library。提供以下组件:

你需要将此依赖项包含在你的项目中:

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-zip</artifactId>
    <version>{project-version}</version>
</dependency>
compile "org.springframework.integration:spring-integration-zip:{project-version}"

Namespace Support

Spring 集成 Zip 模块内的所有组件都提供命名空间支持。为了启用命名空间支持,您需要导入 Spring 集成 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>

(Un)Zip Transformer

ZipTransformer 为下列类型的输入 payload 实现压缩功能:FileStringbyte[]Iterable。输入数据类型可以混合为 Iterable 的一部分。例如,轻松压缩包含字符串、字节数组和文件的集合应而易举。需要注意的是,嵌套的 Iterables 在目前 NOT SUPPORTED

可以通过设置以下几个属性来定制 ZipTransformer

  • compressionLevel - 设置压缩级别。默认值为 Deflater#DEFAULT_COMPRESSION

  • useFileAttributes - 指定是否应将文件名称用于 zip 条目。

例如,要将一个简单的 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 支持这些输入 payloadFilebyte[]InputStream。解压数据时,可以指定 expectSingleResult 属性。如果将其设置为 true 并检测到超过 1 个 zip 条目,则会引发 MessagingException。此属性还会影响有效负载的返回类型。如果将其设置为 false (默认值),则有效负载的类型将为 SortedMap;然而,如果是 true,则将返回实际的 zip 条目。

可以在 UnZipTransformer 上设置的其他属性:

  • deleteFiles - 如果有效负载是 File 的一个实例,则此属性指定在转换后是否删除文件。默认值为 false

  • ZipResultType - 定义转换后返回的数据格式。可用的选项有: Filebyte[]

  • 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"/>

Unzipped Splitter

当 zip 文件包含多于 1 个条目时,UnZipResultSplitter 很实用。从本质上来说,它必须用作上述 UnZipTransformer 之后的集成流中的下一步。它仅支持将 Map 作为输入数据,并将每个条目以 FileHeaders.FILENAMEZipHeaders.ZIP_ENTRY_PATH 标头发送到 outputChannel 中。

以下示例演示了一个用于分割解压结果的简单配置:

  • 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>