48.5.2. タイムアウトおよびタイムアウトハンドラー
概要 リンクのコピーリンクがクリップボードにコピーされました!
非同期処理モデルには、REST 呼び出しにタイムアウトを指定するサポートがあります。デフォルトでは、タイムアウトになると HTTP エラー応答がクライアントに送信されます。ただし、タイムアウトハンドラーコールバックを登録するオプションもあります。これにより、タイムアウトイベントへの応答をカスタマイズできます。
ハンドラーなしでタイムアウトを設定する例 リンクのコピーリンクがクリップボードにコピーされました!
タイムアウトハンドラーを指定せずに単純な呼び出しタイムアウトを定義するには、以下の例のように AsyncResponse
オブジェクトで setTimeout
メソッドを呼び出します。
java.util.concurrent.TimeUnit
クラスの任意の時間単位を使用して、タイムアウト値を指定できることに注意してください。上記の例では、要求をエグゼキュータースレッドプールに送信するコードは提示されていません。タイムアウトの動作をテストするだけであれば、リソースメソッド本文に async.SetTimeout
への呼び出しのみを含めると、タイムアウトは呼び出しごとにトリガーされます。
AsyncResponse.NO_TIMEOUT
の値は無限のタイムアウトを表します。
デフォルトのタイムアウト動作 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、呼び出しタイムアウトがトリガーされると、JAX-RS ランタイムが ServiceUnavailableException
例外を発生させ、ステータス 503
で HTTP エラーの応答を返します。
TimeoutHandler インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
タイムアウトの動作をカスタマイズする場合は、TimeoutHandler
インターフェイスを実装してタイムアウトハンドラーを定義する必要があります。
実装クラスで handleTimeout
メソッドを上書きする場合は、タイムアウトを処理する次の方法のいずれかを選択できます。
-
asyncResponse.cancel
メソッドを呼び出すことで、レスポンスを取り消します。 -
レスポンス値で
asyncResponse.resume
メソッドを呼び出すことで、レスポンスを送信します。 -
asyncResponse.setTimeout
メソッドを呼び出すことで、待機期間を延長します。たとえば、さらに 10 秒間待つには、asyncResponse.setTimeout(10, TimeUnit.SECONDS)
を呼び出しできます。
ハンドラーでタイムアウトを設定する例 リンクのコピーリンクがクリップボードにコピーされました!
タイムアウトハンドラーで呼び出しタイムアウトを定義するには、以下の例のように AsyncResponse
オブジェクトの setTimeout
メソッドと setTimeoutHandler
メソッドの両方を呼び出します。
この例では、呼び出しタイムアウトを処理するために CancelTimeoutHandlerImpl
タイムアウトハンドラーのインスタンスを登録します。
タイムアウトハンドラーを使用した応答の取り消し リンクのコピーリンクがクリップボードにコピーされました!
CancelTimeoutHandlerImpl
タイムアウトハンドラーは以下のように定義されます。
AsyncResponse
オブジェクト上で cancel
を呼び出す効果は、クライアントに HTTP 503 (Service unavailable
) エラーの応答を送信することです。任意で、cancel
メソッド (int
または java.util.Date
の値) の引数を指定できます。これは応答メッセージで Retry-After:
HTTP ヘッダーを設定するために使用されます。ただし、クライアントは多くの場合で Retry-After:
ヘッダーを無視します。
Runnable インスタンスでの取り消し済みの応答への対応 リンクのコピーリンクがクリップボードにコピーされました!
エグゼキュータースレッドプールで処理のためにキューに格納された Runnable
インスタンスとして、一時停止されたリクエストをカプセル化した場合、スレッドプールがリクエストを処理するまでに AsyncResponse
がキャンセルされる可能性があります。このため、Runnable
インスタンスにコードを追加する必要があります。これにより、キャンセルされた AsyncResponse
オブジェクトに対応できるようになります。以下に例を示します。