orb-async.jpg

同期・非同期通信

*Curl ORB for Java version 0.6 がリリースされました。リリースノートはこちら

Curl ORBのコード生成ツールを利用して、非同期通信のメソッドを生成することができます。(通常は同期通信を行うメソッドがコード生成ツールから生成されます。)

非同期通信用メソッドの生成

コード生成ツールのクラス編集画面のMethods欄に”async?“というチェックボックスがあります。これをチェックしますと非同期通信用のメソッドとしてコードが生成されます。

orb-async.jpg

以下が生成されたコードです。

{import * from COM.CURLAP.ORB.SERVLET}

{define-class public Hello {inherits ORBClientForContext}

  {constructor public {default}
    {construct-super.ORBClientForContext “hello”}
  } 

  {method public {say-hello v0:String, …:EventHandler}:AsyncWorker
    {return {self.async-invoke “sayHello”, arguments = {FastArray v0}, {splice …}}}
  }

}

非同期での通信のため、処理を記述する際は結果を待つことなく次の処理に進んでしまいます。(例えば、以下の例ですとsay-helloメソッドを実行した後、終了結果を待たずに{output “xxx”}という行が実行されます。)そこで終了した際の処理を記述するため、生成されたコードの引数”…:EventHandler”に終了時のイベントハンドラーをセットします。この際、AsyncCallbackEvent (COM.CURLAP.ORB.SERVLETパッケージ内)というイベントを使用します。これによりsay-helloが終了しますと{on e:AsyncCallbackEvent do ….}の中の処理が実行されます。

{import * from COM.CURLAP.ORB.SERVLET}
 
{do
    def hello = {Hello}
    {hello.say-hello 
        “this is test”,
        {on e:AsyncCallbackEvent do
              {if-non-null ex = e.exception then
                   || Exceptionが発生した際の処理を記述
                   {dump ex}
               else
                   || 成功した際の処理を記述
                   || 結果はAsyncCallbackEventのobjプロパティで取得できます。
                   def result = e.obj asa #String
              }
        }
    }
    {output “xxx”}
}

AsyncCallbackEventexceptionプロパティとobjプロパティを持っております。
処理中にExceptionが発生した場合は、このexception:#Exceptionをチェックすることができます。

戻り値を受け取る際は、obj:anyプロパティを参照しますと結果が受け取れます。(通常は上記コードのようにキャストすることとなります。)