最新の安定バージョンについては、Spring Integration 7.0.1 を使用してください! |
Zip サポート
この Spring Integration モジュールは、Zip [Wikipedia] (英語) (非) 圧縮のサポートを提供します。圧縮アルゴリズムの実装は ZeroTurnaround ZIP ライブラリ [GitHub] (英語) に基づいています。次のコンポーネントが提供されます。
この依存関係をプロジェクトに含める必要があります。
名前空間サポート
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 の一部として入力データ型を混在させることができます。例: 文字列、バイト配列、ファイルを含むコレクションを簡単に圧縮できるはずです。ネストされた Iterable は現時点では 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 は、入力 payload: File、byte[]、InputStream のこれらをサポートします。データを解凍するとき、expectSingleResult プロパティを指定できます。true に設定され、1 を超える zip エントリが検出された場合、MessagingException が発生します。このプロパティは、ペイロードの戻り値の型にも影響します。false (デフォルト) に設定すると、ペイロードの型は SortedMap になりますが、true の場合は、実際の zip エントリが返されます。
UnZipTransformer で設定できるその他のプロパティ:
deleteFiles- ペイロードがFileのインスタンスである場合、このプロパティは変換後にファイルを削除するかどうかを指定します。デフォルトはfalseです。ZipResultType- 変換後に返されるデータの形式を定義します。利用可能なオプションは次のとおりです:File、byte[]。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>