読者です 読者をやめる 読者になる 読者になる

Murayama blog.

プログラミングと、その次の話

JAX-RS 非同期処理 Asynchronous Services

JAX-RSの非同期処理の実装サンプルです。

参考記事

JerseyのTutorialを参考にしました。

Asynchronous Server API

まずはベタな実装から。こんなふうにするとサーバースレッドはすぐに終わるので再利用できる。

  • @Suspendアノテーションを付与したAsyncResponse引数を用意する
  • 別スレッドの処理終了時にasyncResponse.resume(response);でレスポンスを返す

タイムアウトの設定は次のように実装する。

Asynchronous Server-side Callbacks

非同期処理のコールバックメソッドを作る場合は次のように実装する。

  • asyncResponse.registerでコールバックを登録する
  • このサンプルではCompletionCallbackを実装して登録している
  • CompletionCallbackのonCompleteメソッドはThrowable型の引数を受け取る(正常な場合はnull)

ちょっとだけはまったのが、別スレッドでWebApplicationExceptionのような例外をスローすると引数に代入されないところ。

Interface CompletionCallbackを参照すると、引数Throwableにはunmapped exception instanceが代入される的なことが書いている。

コールバックには以下の2種類がある。

  • CompletionCallback リクエスト終了時に呼び出される(正常でも、異常でも)
  • ConnectionCallback クライアントコネクションがクローズされるときに呼び出される(正常なクローズの場合は呼ばれない)