このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Integration 6.4.3 を使用してください!

Zip サポート

この Spring Integration モジュールは、Zip [Wikipedia] (英語) (非) 圧縮のサポートを提供します。圧縮アルゴリズムの実装は ZeroTurnaround ZIP ライブラリ [GitHub] (英語) に基づいています。次のコンポーネントが提供されます。

この依存関係をプロジェクトに含める必要があります。

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

名前空間サポート

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 の圧縮機能を実装します: FileStringbyte[]IterableIterable の一部として入力データ型を混在させることができます。例: 文字列、バイト配列、ファイルを含むコレクションを簡単に圧縮できるはずです。ネストされた Iterable は現時点では NOT SUPPORTED であることに注意することが重要です。

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 は現在の日付と時刻にフォールバックします。リクエストメッセージのペイロードが 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 は、入力 payloadFilebyte[]InputStream のこれらをサポートします。データを解凍するとき、expectSingleResult プロパティを指定できます。true に設定され、1 を超える zip エントリが検出された場合、MessagingException が発生します。このプロパティは、ペイロードの戻り値の型にも影響します。false (デフォルト) に設定すると、ペイロードの型は SortedMap になりますが、true の場合は、実際の zip エントリが返されます。

UnZipTransformer で設定できるその他のプロパティ:

  • deleteFiles - ペイロードが File のインスタンスである場合、このプロパティは変換後にファイルを削除するかどうかを指定します。デフォルトは false です。

  • ZipResultType - 変換後に返されるデータの形式を定義します。利用可能なオプションは次のとおりです: Filebyte[]

  • workDirectory - ZipResultType が ZipResultType.FILE に設定されている場合、作業ディレクトリが使用されます。デフォルトでは、このプロパティは、サブディレクトリ ziptransformer を含む System 一時ディレクトリに設定されています。

たとえば、単純な 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"/>

Unzip スプリッター

UnZipResultSplitter は、zip ファイルに複数の 1 エントリが含まれている場合に役立ちます。基本的に、前述の UnZipTransformer の後の統合フローの次のステップとして使用する必要があります。入力データとして Map のみをサポートし、FileHeaders.FILENAME および ZipHeaders.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>