バイナリストリーミング

バイナリストリーミングのユースケースでは、ストリームは、何を表すかに関係なく一般的な方法で処理されるバイトの集まりです。たとえば、HTTP 要求の応答、FTP サーバーでのファイルの取得と書き込みなどがあります。

SDK は、Java ​InputStream​ クラスを使用してこの抽象化をサポートします。

操作でのバイナリストリーミング

操作は、ストリームパラメーターを受け取るか、ストリームを返すか、またはその両方を行うことができます。

ファイルコネクタの Write 操作は、ストリームに対して行う操作の例です。

public class FileOperations {

    public void write(@Content InputStream content, String path) {
        // do the writing
    }
}

InputStream​ 型のパラメーターがある場合、SDK は Mule のストリーミング機能を使用するために必要なすべてのサポートを提供します。上記の例の ​content​ パラメーターは、常にストリームの先頭を指す反復可能なストリームに割り当てられ、それが true であるかどうかに関係なく、ストリームが初めて読み取られるかのように処理します。

もう一つの可能性は、Read 操作のように、代わりにバイナリストリームを​返す​操作です。

public class FileOperations {

    public InputStream read(String path) {
        // do the reading
    }
}

InputStream​ を返す場合、SDK はそのストリームを反復可能にするために必要なすべてのマジックを自動的に追加します。

ストリーミングの設定

<repeatable-file-store-stream />​、​<repeatable-in-memory-stream />​、​<non-repeatable-stream />​ などの要素を許可することで、SDK はストリーミングの動作方法を設定するためのサポートを自動的に追加します。上記の Read の例でカスタムファイルストアストリーミングを設定する例を次に示します。

<file:read path="myFile.json">
    <repeatable-file-store-stream inMemorySize="10" bufferUnit="KB"/>
</file:read>

既存のファイルからのストリーミング

バージョン 1.3 以降で使用できます。

<repeatable-file-store-stream>​ 戦略を使用すると、メモリ内のバッファに入り切らない情報が一時的にファイルに格納されます。いくつかのケースでは、この戦略を効率的に使用できず、I/O 要件とディスクスペース要件が最適ではなくなります。

最も一般的なケースは次のとおりです。

シナリオ 1

ファイルの内容を返す操作またはソースを構築する場合です。開発しているコンポーネントは、ファイルを開いて、ファイルの内容を含む InputStream を返します。ファイルのサイズがメモリバッファより大きいと、<repeatable-file-store-stream> はストリームの内容で一時的なファイルの構築を開始します。このファイルは、すでに開いている元のファイルと内容がまったく同じ複製となります。

シナリオ 2

シナリオ 1 のバリエーションとして、操作またはソースが InputStream を取得してから、それを​返す前に​事前処理する必要がある場合です。元のストリームはまだフローにプッシュされていないため、まだ繰り返し可能ではありません。そのためソースは、元のストリームを処理している間は処理済みの内容を一時的なファイルに格納することで、自身でバッファ処理を実装する必要があります。事前処理が完了したら、ソースはファイルの内容をプッシュして、シナリオ 1 に戻ります。

これら 2 つのシナリオから、自身で新しいファイルを作成する繰り返し可能なストリーミングフレームワークを使用するのではなく、同じ内容がすでに元のファイルにあるわけですから、その既存ファイルの内容から繰り返し可能なストリームを取得すべきであることは明白です。

これらのシナリオでは ​ImmutableFileRepeatableInputStream​ クラスを使用します。このクラスは、標準クラスの ​java.io.FileInputStream​ と似ていますが、Mule Runtime Engine (Mule) が新しいバッファファイルを作成するのを防止し、既存のファイルを使用するように指示します。

たとえば、このクラスは次のような操作で使用できます。

@MediaType(value = ANY, strict = false)
public InputStream read(String path) {
	File file = new File(path);
	if (!file.exists()) {
		// throw ModuleException
	}

	return new ImmutableFileRepeatableInputStream(file);
}

このような性質のファイルを処理する場合には、削除するタイミングを理解することが重要です。ユースケースによっては、自分で作成したコードでファイルを作成する必要になります。単純なケースでは、ストリームを閉じるときにファイルを削除できます。ストリームを閉じるときにファイルを削除する場合は、次の便利なコンストラクターを使用すれば、ストリームを閉じるときに自動的にファイルを削除するように Mule に指示できます。

new ImmutableFileRepeatableInputStream(file, true);

この機能を使用するには、ファイルが不変である必要があります。つまり、​ImmutableFileRepeatableInputStream​ インスタンスが作成された後は、少なくとも ​ImmutableFileRepeatableInputStream​ が閉じるまでは、ファイルの内容を変更することはできません。フローの読み取り中にファイルの内容が変更されてしまうと、不整合やダーティリード、またはその他の競合が発生することがあります。