Compression Module

Compression Module v2.1

Compression Module では、最もよく使用されるファイルアーカイブツールと圧縮形式がサポートされ、Mule アプリケーションを介してそれらへのアクセスが提供されます。

ファイルアーカイブツールは、複数のファイルを 1 つのアーカイブファイルに結合してトランスポートや保存を容易にするコンピュータープログラムです。ほとんどのアーカイブツールはそのアーカイブ形式のデータ圧縮を使用して最終アーカイブのサイズを削減します。ただし、すべての圧縮アルゴリズムが複数のファイルをアーカイブできるとは限りません。一部の圧縮アルゴリズムは、単一ファイルのデータ圧縮に制限されます。

このモジュールでは、使用可能な各形式のファイルを、各形式に関連付けられたアルゴリズムにより提供される機能を失わずに、圧縮および圧縮解除します。

この機能を果たすため、このモジュールでは 2 組の操作が提供されます。1 つは、単一ファイルの圧縮と圧縮解除、もう 1 つは、ファイルのバンドルのアーカイブと抽出です。必要に応じて圧縮またはアーカイブ戦略を使用して、この各操作を設定できます。

リリースノート: Compression Module リリースノート
Exchange: Compression Module

単一ファイルの圧縮と圧縮解除

コンテンツの圧縮

入力ストリームが提供されると、モジュールはストリームを圧縮して新しい圧縮されたビットストリームを返します。これで、そのストリームをファイルシステムに保存したり、別のシステムに転送したりできます。

圧縮ツール戦略

圧縮ツール戦略では、ファイルまたは単一エントリアーカイブを圧縮できます。

GZip 圧縮ツール戦略

操作でこの戦略を使用した場合、コンテンツを ​gzip​ 形式で圧縮する必要があることが宣言されます。

<compression:gzip-compressor/>
Zip 圧縮ツール戦略

操作でこの戦略を使用した場合、コンテンツを ​zip​ 形式で圧縮する必要があることが宣言されます。

<compression:zip-compressor/>

Compress 操作

<compression:compress>
   <compression:content>#[payload.data]</compression:content> (1)
   <compression:compressor>
       <compression:zip-compressor/> (2)
   </compression:compressor>
</compression:compress>
1 圧縮する ​InputStream​。デフォルトは ​#[payload]​ です。
2 使用する圧縮ツール戦略。

圧縮エラー

コンテンツの圧縮中にエラーが発生した場合、​COMPRESSION:COULD_NOT_COMPRESS​ エラーがスローされます。

コンテンツの圧縮解除

指定された圧縮形式のアーカイブであるとみなされる圧縮された単一エントリコンテンツを圧縮解除します。

圧縮解除ツール戦略

圧縮解除ツール戦略では、ファイルまたは単一エントリアーカイブの圧縮解除方法が認識されています。

GZip 圧縮解除ツール戦略

操作でこの戦略を使用した場合、コンテンツを ​gzip​ 形式で圧縮解除する必要があることが宣言されます。

<compression:gzip-decompressor/>

Zip 圧縮解除ツール戦略

操作でこの戦略を使用した場合、コンテンツを ​zip​ 形式で圧縮解除する必要があることが宣言されます。

<compression:zip-decompressor/>

Decompress 操作

<compression:decompress>
   <compression:content>#[payload]</compression:content> (1)
   <compression:decompressor>
       <compression:gzip-decompressor/> (2)
   </compression:decompressor>
</compression:decompress>
1 圧縮解除する ​InputStream​。デフォルトは ​#[payload]​ です。
2 使用する圧縮解除ツール戦略。

圧縮解除エラー

提供されたコンテンツが、設定された戦略の形式に一致しない場合、​COMPRESSION:INVALID_ARCHIVE​ エラーがスローされます。

圧縮解除するアーカイブに複数のエントリが含まれる場合、この操作は ​COMPRESSION:TOO_MANY_ENTRIES​ エラーで失敗します。返す 1 つのエントリのみを選択できないためです。この場合、Extract 操作を使用する必要があります。

複数のエントリのアーカイブと抽出

Archive

<entryName,InputStream>​ のマップが提供されると、アーカイブプロセスにより、提供されたすべてのエントリが 1 つの新しいアーカイブに、設定された形式で圧縮されます。

アーカイブツール戦略

アーカイブツール戦略の目的は、複数のエントリを 1 つのアーカイブに圧縮することです。

Zip アーカイブツール戦略

操作で Zip アーカイブツール戦略を使用した場合、コンテンツを ​zip​ 形式で圧縮する必要があることが宣言されます。

<compression:zip-archiver/>

Archive 操作

この操作では、圧縮するエントリとその値を特定するマップを受け取ります。この操作に渡された各エントリは、指定された名前を持つ圧縮されたアーカイブ内に配置されます。

<compression:archive>
   <compression:entries> (1)
    #[
       {
         summary.pdf: vars.summary,
         'details/result_001.pdf': vars.file1
         'details/result_002.pdf': vars.file2
       }
     ]
   </compression:entries>
   <compression:archiver>
       <compression:zip-archiver/> (2)
   </compression:archiver>
</compression:archive>
1 圧縮するエントリの各名前をキーとして定義し、そのエントリのコンテンツを値として定義する DataWeave スクリプト。
2 使用するアーカイブツール戦略。

結果のアーカイブには ​3 つのエントリ​が含まれます。1 つはルートレベルの ​summary.pdf​ という名前のエントリ。その他は ​details​ というディレクトリ内の ​result_001.pdf​ および ​result_002.pdf​ というエントリです。

+- content.zip
|  \- summary.pdf
|  \+ details
   |  \- result_001.pdf
   |  \- result_002.pdf

エントリの名前の中にあるスラッシュ (​/​) (​details/result_001.pdf​ など) はディレクトリの分離を示します。これにより、アーカイブ内でディレクトリを作成するすべての名前が調べられます。

DataWeave 式を使用して Archive 操作への入力を作成する場合、DataWeave 式で、Java Map オブジェクトをビルドするために使用するオブジェクトを出力する必要があります。各キーは、アーカイブに追加するオブジェクト全体で一意である必要があります。

アーカイブエラー

コンテンツの圧縮中に問題が発生した場合、​COMPRESSION:COULD_NOT_COMPRESS​ エラーがスローされます。

Extract

いずれかの圧縮形式でアーカイブを表しているコンテンツを圧縮解除します。

抽出ツール戦略

抽出ツール戦略では、特定の形式で圧縮されている複数のエントリを含むアーカイブを圧縮解除できます。

Zip 戦略

操作でこの戦略を使用した場合、コンテンツを ​zip​ 形式で抽出する必要があることが宣言されます。

<compression:zip-archiver/>

Extract 操作

<compression:extract>
    <compression:compressed>#[vars.archive]</compression:compressed> (1)
    <compression:extractor>
        <compression:zip-extractor/> (2)
    </compression:extractor>
</compression:extract>
1 抽出する圧縮済みコンテンツ。デフォルトは ​#[payload]​ です。
2 このアーカイブのエントリはオブジェクトとして返され、各オブジェクトにはその名前でアクセスできます。たとえば、次の構造を持つ 3 つのエントリを含むアーカイブが圧縮解除されたとします。
+- Archive
|  \- summary.pdf
|  \+ details
   |  \- result_001.pdf
   |  \- result_002.pdf

この場合、各エントリの抽出したコンテンツに ​payload['summary.pdf']​ または ​payload.details['result_001.pdf']​ のようにアクセスできます。

アーカイブおよび抽出ツールの例

この例では、input という名前のフォルダーからすべてのファイルを読み取り、キーをファイル名、値を読み取られたファイルの値に設定してオブジェクトを作成することで圧縮されたアーカイブを作成します。次にアーカイブを抽出します。その後、For-Each スコープは抽出された各キー/値を反復処理し、キーを新しいファイル名、値を対応するファイルの抽出されたコンテンツとしてファイルを新しい出力フォルダーに書き込みます。

  <flow name="archive-extract-test" >
	<scheduler doc:name="Scheduler">
		<scheduling-strategy >
			<fixed-frequency frequency="15" timeUnit="SECONDS"/>
		</scheduling-strategy>
	</scheduler>
	<file:list doc:name="List" config-ref="File_Config" directoryPath="input"/>
	<set-payload value='#[output application/java
---
(0 to sizeOf(payload) - 1) as Array
reduce (index, acc={}) -&gt;
acc ++ { (payload[index].attributes.fileName): payload[index].payload}]' doc:name="Set Payload" />

	<compression:archive doc:name="Archive" >
		<compression:archiver>
			<compression:zip-archiver />
		</compression:archiver>
	</compression:archive>

	<compression:extract doc:name="Extract"  >
		<compression:extractor >
			<compression:zip-extractor />
		</compression:extractor>
	</compression:extract>

	<foreach doc:name="For Each"  collection="payload">
	  <file:write doc:name="Write"  config-ref="File_Config" path='#[output application/json
---
"output/" ++ (payload pluck $$)[0]]' >
	    <file:content ><![CDATA[#[output application/java --- ( payload pluck $ )[0]]]]></file:content>
	  </file:write>
	</foreach>

	<logger level="INFO" doc:name="Logger" message="#[output application/json --- payload]"/>
  </flow>
</mule>

抽出ツールエラー

コンテンツが、設定された形式ではない場合、​COMPRESSION:INVALID_ARCHIVE​ エラーがスローされます。圧縮プロセス中にその他のエラーが発生した場合、操作で ​COMPRESSION:COULD_NOT_DECOMPRESS​ エラーがスローされます。

一般的なユースケース

ファイルの圧縮

次の例では、ファイルを読み取り、圧縮して、保存します。

<file:read path="file.txt"/>
<compression:compress>
   <compression:compressor>
       <compression:gzip-compressor/>
   </compression:compressor>
</compression:compress>
<file:write path="file-txt.gz"/>

リモートサービスからのペイロードの圧縮解除

次の例では、Zip ファイルを返して圧縮解除するサーバーを呼び出します。

<wsc:consume config="ZipServiceConfig" operation="returnsZip"/>
<compression:decompress>
   <compression:content>
      #[payload.body.zipContent]
   </compression:content>
   <compression:decompressor>
       <compression:zip-decompressor/>
   </compression:decompressor>
</compression:decompress>