このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Integration 6.4.3 を使用してください! |
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 エントリに使用するかどうかを指定します。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
は、入力 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>