インターフェース AsyncHandlerInterceptor

すべてのスーパーインターフェース:
HandlerInterceptor
すべての既知の実装クラス:
WebRequestHandlerInterceptorAdapter

public interface AsyncHandlerInterceptor extends HandlerInterceptor
非同期リクエスト処理の開始後に呼び出されるコールバックメソッドで HandlerInterceptor を拡張します。

ハンドラーが非同期リクエストを開始すると、DispatcherServlet は、通常の同期リクエストの場合と同様に、postHandle および afterCompletion を呼び出さずに終了します。これは、リクエスト処理の結果(ModelAndView など)がまだ準備ができておらず、別のスレッドから同時に生成されるためです。そのようなシナリオでは、代わりに afterConcurrentHandlingStarted(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse, java.lang.Object) が呼び出され、サーブレットコンテナーにスレッドを解放する前に実装がスレッドバインド属性のクリーンアップなどのタスクを実行できるようにします。

非同期処理が完了すると、リクエストはさらに処理するためにコンテナーにディスパッチされます。この段階で、DispatcherServlet は preHandlepostHandleafterCompletion を呼び出します。非同期処理が完了した後の最初のリクエストと後続のディスパッチを区別するために、インターセプターは ServletRequestEE の jakarta.servlet.DispatcherType が "REQUEST" であるか "ASYNC" であるかを確認できます。

HandlerInterceptor 実装は、非同期リクエストがタイムアウトするか、ネットワークエラーで完了したときに機能する必要がある場合があることに注意してください。このような場合、サーブレットコンテナーはディスパッチしないため、postHandle および afterCompletion メソッドは呼び出されません。代わりに、インターセプターを登録して、WebAsyncManager の registerCallbackInterceptor および registerDeferredResultInterceptor メソッドを介して非同期リクエストを追跡できます。これは、非同期リクエスト処理が開始されるかどうかに関係なく、preHandle からのすべてのリクエストで事前に実行できます。

導入:
3.2
作成者:
Rossen Stoyanchev
関連事項:
  • メソッドの詳細

    • afterConcurrentHandlingStarted

      default void afterConcurrentHandlingStarted(HttpServletRequestEE request, HttpServletResponseEE response, ObjectSE handler) throws ExceptionSE
      ハンドラーが同時に実行されている場合、postHandle および afterCompletion の代わりに呼び出されます。

      実装では、提供されたリクエストとレスポンスを使用できますが、ハンドラーの同時実行と競合する方法で変更しないでください。このメソッドの典型的な使用箇所は、スレッドローカル変数をクリーンアップすることです。

      パラメーター:
      request - 現在のリクエスト
      response - 現在のレスポンス
      handler - 型および / またはインスタンスの検査のために、非同期実行を開始したハンドラー(または HandlerMethod
      例外:
      ExceptionSE - エラーの場合