对于最新的稳定版本,请使用 Spring Integration 6.4.3spring-doc.cadn.net.cn

Zip 支持

这个 Spring 集成模块提供了 Zip(解)压缩支持。 压缩算法实现基于 ZeroTurnaround ZIP 库。 提供了以下组件:spring-doc.cadn.net.cn

您需要将此依赖项包含在您的项目中:spring-doc.cadn.net.cn

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

命名空间支持

Spring Integration Zip 模块中的所有组件都提供名称空间支持。 为了启用命名空间支持,您需要导入 Spring Integration Zip Module 的模式。 以下示例显示了一个典型的设置:spring-doc.cadn.net.cn

<?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. 例如,压缩包含 Strings、byte 数组和 Files 的集合应该很容易。 需要注意的是,目前不支持嵌套的 Iterables。spring-doc.cadn.net.cn

ZipTransformer可以通过设置多个属性进行自定义:spring-doc.cadn.net.cn

例如,要压缩一个简单的test.txt文件转换为test.txt.zip,只需此配置就足够了:spring-doc.cadn.net.cn

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

ZipTransformerJavadocs 了解更多信息。spring-doc.cadn.net.cn

UnZipTransformer支持这些输入payload:File,byte[]InputStream. 解压缩数据时,expectSingleResultproperty 的 如果设置为true而且超过1zip 条目,则MessagingException将提高。 此属性还会影响有效负载的返回类型。 如果设置为false(default),则有效负载的类型为SortedMap如果true,但是,将返回实际的 zip 条目。spring-doc.cadn.net.cn

可以在UnZipTransformer:spring-doc.cadn.net.cn

  • deleteFiles- 如果有效负载是File中,此属性指定是否在转换后删除 File。 默认值为false.spring-doc.cadn.net.cn

  • ZipResultType- 定义转换后返回的数据的格式。 可用选项包括:File,byte[].spring-doc.cadn.net.cn

  • workDirectory- 当ZipResultType设置为ZipResultType.FILE. 默认情况下,此属性设置为包含子目录的 System 临时目录ziptransformer.spring-doc.cadn.net.cn

例如,要压缩一个简单的test.zip文件添加到其条目的 map 中,只需此配置就足够了:spring-doc.cadn.net.cn

@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

UnZipResultSplitter在 zip 文件包含超过1进入。 从本质上讲,在上述作之后,它必须用作集成流程中的下一步UnZipTransformer. 它仅支持Map作为输入数据,并将每个条目发送到outputChannelFileHeaders.FILENAMEZipHeaders.ZIP_ENTRY_PATH头。spring-doc.cadn.net.cn

以下示例演示了拆分解压缩结果的简单配置:spring-doc.cadn.net.cn

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