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 クライアントコネクションがクローズされるときに呼び出される(正常なクローズの場合は呼ばれない)