*Curl ORB for Java version 0.6 がリリースされました。リリースノートはこちら。
ストリームを利用した使用メモリ量削減
サイズの大きなデータをクライアントへ返す際、オブジェクトを生成してから結果を返すと多くのメモリを必要とてしまうため、順次ストリームに書き込む機能が用意されています。このコードは自動生成されないため、以下にサンプルを用いてコーディング方法を説明します。ここで使用するAPIは、SerializableStreamWriterクラス (com.curlap.orb.ioパッケージ)です。
サンプルと利用方法
この機能を利用するには、Javaサービスクラスのメソッドの戻り値をvoidにし、引数の最後にSerializableStreamWriterクラスを指定します。サーバサイドの開発者はこのSerializableStreamWriterクラスのwriteメソッドを用いて、クライアントに返すデータをストリームに書き込みます。ストリームの終了にはcloseを実行します。
// Java public class StreamTest implements java.io.Serializable { // 結果にString, int, 日付オブジェクト書き込む。 // 結果にFooの配列を書き込む |
Curl側では、引数のSerializableStreamWriterを省いて、戻り値をvoidの代わりにArray ({Array-of any}と同じ)を指定します。これによりJava側でSerializableStreamWriterに書き込んだオブジェクトを、Curl側でArrayの戻り値として受け取ることが可能となります。また、当機能を利用する場合は、self.invokeのキーワード引数として、is-stream-response?をtrueにする必要があります。(実際には、Javaサービスクラスを作成し、コード生成ツールでCurlコードを生成した後、Curlコードを修正する方法が良いとおもいます。)
|| Curl {constructor public {default} || method1 || method2 |
クライアントの利用方法は以下の通りです。
def stream-test = {StreamTest} {for f in {Stream-test.method2} do |
もちろんレコードのようなデータを一行づつ書き込むことができ、大量データをデータベースからクライアントで取得することもできます。