インターフェース AsyncContext
AsyncContext は、ServletRequest.startAsync() または ServletRequest.startAsync(ServletRequest, ServletResponse) の呼び出しによって作成および初期化されます。これらのメソッドを繰り返し呼び出すと、同じ AsyncContext インスタンスが返され、必要に応じて再初期化されます。
非同期操作がタイムアウトした場合、コンテナーは次の手順を実行する必要があります。
onTimeoutメソッドで、非同期操作が開始された ServletRequest に登録されているすべてのAsyncListenerインスタンスを呼び出します。- どのリスナーも
complete()またはdispatch()メソッドのいずれも呼び出さない場合は、 HttpServletResponse.SC_INTERNAL_SERVER_ERROR に等しいステータスコードでエラーディスパッチを実行します。 - 一致するエラーページが見つからなかった場合、またはエラーページが
complete()またはdispatch()メソッドのいずれも呼び出さなかった場合は、complete()を呼び出します。
- 導入:
- Servlet 3.0
フィールドのサマリー
フィールド修飾子と型フィールド説明static final StringSEdispatch(String)またはdispatch(ServletContext,String)のターゲットが元のコンテキストパスを使用できるようにするリクエスト属性の名前static final StringSE元のHttpServletMappingがdispatch(String)またはdispatch(ServletContext,String)のターゲットで使用可能になるリクエスト属性の名前static final StringSEdispatch(String)またはdispatch(ServletContext,String)のターゲットが元のパス情報を使用できるようにするリクエスト属性の名前static final StringSE元のクエリ文字列がdispatch(String)またはdispatch(ServletContext,String)のターゲットで使用可能になるリクエスト属性の名前static final StringSEdispatch(String)またはdispatch(ServletContext,String)のターゲットが元のリクエスト URI を使用できるようにするリクエスト属性の名前static final StringSEdispatch(String)またはdispatch(ServletContext,String)のターゲットが元のサーブレットパスを使用できるようにするリクエスト属性の名前方法の概要
修飾子と型メソッド説明voidaddListener(AsyncListener listener) 指定されたAsyncListenerを、ServletRequest.startAsync()メソッドの 1 つへの呼び出しによって開始された最新の非同期サイクルに登録します。voidaddListener(AsyncListener listener, ServletRequest servletRequest, ServletResponse servletResponse) 指定されたAsyncListenerを、ServletRequest.startAsync()メソッドの 1 つへの呼び出しによって開始された最新の非同期サイクルに登録します。voidcomplete()この AsyncContext の初期化に使用されたリクエストで開始された非同期操作を完了し、この AsyncContext の初期化に使用されたレスポンスを閉じます。<T extends AsyncListener>
TcreateListener(ClassSE<T> clazz) 指定されたAsyncListenerクラスをインスタンス化します。voiddispatch()この AsyncContext のリクエストオブジェクトとレスポンスオブジェクトをサーブレットコンテナーにディスパッチします。voiddispatch(ServletContext context, StringSE path) この AsyncContext のリクエストオブジェクトとレスポンスオブジェクトを、指定されたコンテキストを範囲とする指定されたパスにディスパッチします。voidこの AsyncContext のリクエストオブジェクトとレスポンスオブジェクトを指定された path にディスパッチします。ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)を呼び出して、この AsyncContext を初期化するために使用されたリクエストを取得します。ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)を呼び出して、この AsyncContext を初期化するために使用されたレスポンスを取得します。longこの AsyncContext のタイムアウト(ミリ秒単位)を取得します。booleanこの AsyncContext が元のオブジェクトまたはアプリケーションでラップされたリクエストオブジェクトとレスポンスオブジェクトで初期化されたかどうかを確認します。voidsetTimeout(long timeout) この AsyncContext のタイムアウト(ミリ秒単位)を設定します。voidstart(RunnableSE run) コンテナーにスレッドをディスパッチし、管理されたスレッドプールからスレッドをディスパッチして、指定された Runnable を実行します。
フィールドの詳細
ASYNC_REQUEST_URI
dispatch(String)またはdispatch(ServletContext,String)のターゲットが元のリクエスト URI を使用できるようにするリクエスト属性の名前- 関連事項:
ASYNC_CONTEXT_PATH
dispatch(String)またはdispatch(ServletContext,String)のターゲットが元のコンテキストパスを使用できるようにするリクエスト属性の名前- 関連事項:
ASYNC_MAPPING
元のHttpServletMappingがdispatch(String)またはdispatch(ServletContext,String)のターゲットで使用可能になるリクエスト属性の名前- 関連事項:
ASYNC_PATH_INFO
dispatch(String)またはdispatch(ServletContext,String)のターゲットが元のパス情報を使用できるようにするリクエスト属性の名前- 関連事項:
ASYNC_SERVLET_PATH
dispatch(String)またはdispatch(ServletContext,String)のターゲットが元のサーブレットパスを使用できるようにするリクエスト属性の名前- 関連事項:
ASYNC_QUERY_STRING
元のクエリ文字列がdispatch(String)またはdispatch(ServletContext,String)のターゲットで使用可能になるリクエスト属性の名前- 関連事項:
メソッドの詳細
getRequest
ServletRequest getRequest()ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)を呼び出して、この AsyncContext を初期化するために使用されたリクエストを取得します。- 戻り値:
- この AsyncContext の初期化に使用されたリクエスト
- 例外:
IllegalStateExceptionSE-complete()またはdispatch()メソッドのいずれかが非同期サイクルで呼び出された場合
getResponse
ServletResponse getResponse()ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)を呼び出して、この AsyncContext を初期化するために使用されたレスポンスを取得します。- 戻り値:
- この AsyncContext を初期化するために使用されたレスポンス
- 例外:
IllegalStateExceptionSE-complete()またはdispatch()メソッドのいずれかが非同期サイクルで呼び出された場合
hasOriginalRequestAndResponse
boolean hasOriginalRequestAndResponse()この AsyncContext が元のオブジェクトまたはアプリケーションでラップされたリクエストオブジェクトとレスポンスオブジェクトで初期化されたかどうかを確認します。この情報は、リクエストが非同期モードになった後、 送信方向に呼び出されたフィルターが、 受信の呼び出し中に追加されたリクエストやレスポンスのラッパーを、非同期操作の間保存する必要があるのか、あるいは解放する必要があるのかを判断するために使用することができます。
- 戻り値:
- この AsyncContext が
ServletRequest.startAsync()の呼び出しによって元のリクエストオブジェクトとレスポンスオブジェクトで初期化された場合、またはServletRequest.startAsync(ServletRequest, ServletResponse)の呼び出しによって初期化され、ServletRequest と ServletResponse のどちらの引数もアプリケーション提供のラッパーを持たない場合は true。そうでなければ偽
dispatch
void dispatch()この AsyncContext のリクエストオブジェクトとレスポンスオブジェクトをサーブレットコンテナーにディスパッチします。非同期サイクルが
ServletRequest.startAsync(ServletRequest, ServletResponse)で開始され、渡されたリクエストが HttpServletRequest のインスタンスである場合、ディスパッチはHttpServletRequest.getRequestURI()によって返された URI に対して行われます。それ以外の場合、ディスパッチは、コンテナーによって最後にディスパッチされたときのリクエストの URI になります。次のシーケンスは、これがどのように機能するかを示しています。
// REQUEST dispatch to /url/A AsyncContext ac = request.startAsync(); ... ac.dispatch(); // ASYNC dispatch to /url/A // REQUEST to /url/A // FORWARD dispatch to /url/B request.getRequestDispatcher("/url/B").forward(request,response); // Start async operation from within the target of the FORWARD // dispatch ac = request.startAsync(); ... ac.dispatch(); // ASYNC dispatch to /url/A // REQUEST to /url/A // FORWARD dispatch to /url/B request.getRequestDispatcher("/url/B").forward(request,response); // Start async operation from within the target of the FORWARD // dispatch ac = request.startAsync(request,response); ... ac.dispatch(); // ASYNC dispatch to /url/Bこのメソッドは、リクエストオブジェクトとレスポンスオブジェクトをコンテナー管理スレッドに渡した直後に戻り、そこでディスパッチ操作が実行されます。コンテナーによって開始されたディスパッチ中にこのメソッドが呼び出された場合、ディスパッチ操作は、コンテナーによって開始されたディスパッチがコンテナーに戻るまで遅延されます。
注: コンテナーによって開始されたディスパッチには、次の呼び出しが含まれます。ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)が呼び出されるServlet.service(ServletRequest, ServletResponse)ReadListener.onDataAvailable()ReadListener.onAllDataRead()WriteListener.onWritePossible()
このメソッドが呼び出されたときに出力ストリームがノンブロッキングモードである場合、出力ストリームは
ServletOutputStream#closeに従って閉じられ、進行中のノンブロッキング書き込みが完了するまでディスパッチ操作は遅延されます。リクエストのディスパッチャー型は DispatcherType.ASYNC に設定されています。
forward dispatchesとは異なり、レスポンスバッファーとヘッダーはリセットされず、レスポンスがすでにコミットされている場合でもディスパッチすることは正当です。リクエストとレスポンスの制御はディスパッチターゲットに委譲され、ディスパッチターゲットの実行が完了すると、
ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)が呼び出されない限り、レスポンスは閉じられます。このメソッドの実行中に発生する可能性のあるエラーまたは例外は、次のように、コンテナーによってキャッチおよび処理される必要があります。
onErrorメソッドで、この AsyncContext が作成された ServletRequest に登録されているすべてのAsyncListenerインスタンスを呼び出し、キャッチされた Throwable をAsyncEvent.getThrowable()経由で使用できるようにします。- どのリスナーも
complete()またはdispatch()メソッドのいずれも呼び出さなかった場合は、 HttpServletResponse.SC_INTERNAL_SERVER_ERROR に等しいステータスコードでエラーディスパッチを実行し、上記の Throwable を RequestDispatcher.ERROR_EXCEPTION リクエスト属性の値。 - 一致するエラーページが見つからなかった場合、またはエラーページが
complete()またはdispatch()メソッドのいずれも呼び出さなかった場合は、complete()を呼び出します。
非同期サイクルごとに最大 1 つの非同期ディスパッチ操作を実行できます。非同期サイクルは、
ServletRequest.startAsync()メソッドの 1 つを呼び出すことによって開始されます。同じ非同期サイクル内で追加の非同期ディスパッチ操作を実行しようとすると、IllegalStateException が呼び出されます。ディスパッチされたリクエストでその後 startAsync が呼び出されると、ディスパッチメソッドまたはcomplete()メソッドのいずれかが呼び出される可能性があります。- 例外:
IllegalStateExceptionSE- ディスパッチメソッドの 1 つが呼び出され、その結果のディスパッチ中に startAsync メソッドが呼び出されなかった場合、またはcomplete()が呼び出された場合- 関連事項:
dispatch
この AsyncContext のリクエストオブジェクトとレスポンスオブジェクトを指定された path にディスパッチします。path パラメーターは、この AsyncContext が初期化された
ServletContextのスコープ内で、ServletRequest.getRequestDispatcher(String)と同じように解釈されます。リクエストのすべてのパス関連クエリメソッドはディスパッチターゲットを反映する必要がありますが、元のリクエスト URI、コンテキストパス、パス情報、サーブレットパス、クエリ文字列は、
ASYNC_REQUEST_URI、ASYNC_CONTEXT_PATH、ASYNC_PATH_INFO、ASYNC_SERVLET_PATH、ASYNC_QUERY_STRINGの属性から回復できます。リクエスト。これらの属性は、繰り返しディスパッチされている場合でも、常に元のパス要素を反映します。非同期サイクルごとに最大 1 つの非同期ディスパッチ操作を実行できます。非同期サイクルは、
ServletRequest.startAsync()メソッドの 1 つを呼び出すことによって開始されます。同じ非同期サイクル内で追加の非同期ディスパッチ操作を実行しようとすると、IllegalStateException が呼び出されます。ディスパッチされたリクエストでその後 startAsync が呼び出されると、ディスパッチメソッドまたはcomplete()メソッドのいずれかが呼び出される可能性があります。エラー処理を含む詳細については、
dispatch()を参照してください。- パラメーター:
path- この AsyncContext が初期化された ServletContext をスコープとするディスパッチターゲットのパス- 例外:
IllegalStateExceptionSE- ディスパッチメソッドの 1 つが呼び出され、その結果のディスパッチ中に startAsync メソッドが呼び出されなかった場合、またはcomplete()が呼び出された場合- 関連事項:
dispatch
この AsyncContext のリクエストオブジェクトとレスポンスオブジェクトを、指定されたコンテキストを範囲とする指定されたパスにディスパッチします。path パラメーターは、指定された context をスコープとすることを除いて、
ServletRequest.getRequestDispatcher(String)と同じように解釈されます。リクエストのすべてのパス関連クエリメソッドはディスパッチターゲットを反映する必要がありますが、元のリクエスト URI、コンテキストパス、パス情報、サーブレットパス、クエリ文字列は、
ASYNC_REQUEST_URI、ASYNC_CONTEXT_PATH、ASYNC_PATH_INFO、ASYNC_SERVLET_PATH、ASYNC_QUERY_STRINGの属性から回復できます。リクエスト。これらの属性は、繰り返しディスパッチされている場合でも、常に元のパス要素を反映します。非同期サイクルごとに最大 1 つの非同期ディスパッチ操作を実行できます。非同期サイクルは、
ServletRequest.startAsync()メソッドの 1 つを呼び出すことによって開始されます。同じ非同期サイクル内で追加の非同期ディスパッチ操作を実行しようとすると、IllegalStateException が呼び出されます。ディスパッチされたリクエストでその後 startAsync が呼び出されると、ディスパッチメソッドまたはcomplete()メソッドのいずれかが呼び出される可能性があります。エラー処理を含む詳細については、
dispatch()を参照してください。- パラメーター:
context- ディスパッチターゲットの ServletContextpath- 指定された ServletContext をスコープとするディスパッチターゲットのパス- 例外:
IllegalStateExceptionSE- ディスパッチメソッドの 1 つが呼び出され、その結果のディスパッチ中に startAsync メソッドが呼び出されなかった場合、またはcomplete()が呼び出された場合- 関連事項:
complete
void complete()この AsyncContext の初期化に使用されたリクエストで開始された非同期操作を完了し、この AsyncContext の初期化に使用されたレスポンスを閉じます。この AsyncContext が作成された ServletRequest に登録された型
AsyncListenerのリスナーは、そのonCompleteメソッドで呼び出されます。ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)の呼び出し後、このクラスのディスパッチメソッドの 1 つを呼び出す前であれば、いつでもこのメソッドを呼び出すことができます。コンテナーによって開始されたディスパッチ中にこのメソッドが呼び出された場合、その呼び出しは、コンテナーによって開始されたディスパッチがコンテナーに戻るまで有効になりません (必要なリスナー呼び出しを含む)。
注: コンテナーによって開始されたディスパッチには、次の呼び出しが含まれます。ServletRequest.startAsync()またはServletRequest.startAsync(ServletRequest, ServletResponse)が呼び出されるServlet.service(ServletRequest, ServletResponse)ReadListener.onDataAvailable()ReadListener.onAllDataRead()WriteListener.onWritePossible()
このメソッドが呼び出されたときに出力ストリームがノンブロッキングモードである場合、出力ストリームは
ServletOutputStream#closeに従って閉じられ、完了するためのこの呼び出しは、進行中のメソッドが完了するまで有効になりません (そして、AsyncListener.onComplete(AsyncEvent)の呼び出しは遅延されます)。ノンブロッキング書き込みが完了しました。start
コンテナーがスレッドをディスパッチし、おそらくマネージスレッドプールから、指定された Runnable を実行します。コンテナーは、適切なコンテキスト情報を Runnable に伝達します。- パラメーター:
run- 非同期ハンドラー
addListener
指定されたAsyncListenerを、ServletRequest.startAsync()メソッドの 1 つへの呼び出しによって開始された最新の非同期サイクルに登録します。指定された AsyncListener は、非同期サイクルが正常に完了するか、タイムアウトしてエラーが発生するか、
ServletRequest.startAsync()メソッドの 1 つを介して新しい非同期サイクルが開始されると、AsyncEventを受け取ります。AsyncListener インスタンスは、追加された順に通知されます。
ServletRequest.startAsync(ServletRequest, ServletResponse)またはServletRequest.startAsync()が呼び出された場合、AsyncListenerが通知されたときに、AsyncEventからまったく同じリクエストおよびレスポンスオブジェクトを使用できます。- パラメーター:
listener- 登録する AsyncListener- 例外:
IllegalStateExceptionSE-ServletRequest.startAsync()メソッドの 1 つが呼び出されたコンテナー起動のディスパッチがコンテナーに戻った後にこのメソッドが呼び出された場合
addListener
void addListener(AsyncListener listener, ServletRequest servletRequest, ServletResponse servletResponse) 指定されたAsyncListenerを、ServletRequest.startAsync()メソッドの 1 つへの呼び出しによって開始された最新の非同期サイクルに登録します。指定された AsyncListener は、非同期サイクルが正常に完了するか、タイムアウトしてエラーが発生するか、
ServletRequest.startAsync()メソッドの 1 つを介して新しい非同期サイクルが開始されると、AsyncEventを受け取ります。AsyncListener インスタンスは、追加された順に通知されます。
指定された ServletRequest オブジェクトと ServletResponse オブジェクトは、指定された
AsyncEventのgetSuppliedRequestメソッドとgetSuppliedResponseメソッドを介して、指定された AsyncListener で使用できるようになります。これらのオブジェクトは、AsyncEvent の配信時にそれぞれ読み取りまたは書き込みを行うべきではありません。指定された AsyncListener が登録されてから追加の折り返しが発生した可能性があるためですが、それらに関連付けられているリソースを解放するために使用される場合があります。- パラメーター:
listener- 登録する AsyncListenerservletRequest- AsyncEvent に含まれる ServletRequestservletResponse- AsyncEvent に含まれる ServletResponse- 例外:
IllegalStateExceptionSE-ServletRequest.startAsync()メソッドの 1 つが呼び出されたコンテナー起動のディスパッチがコンテナーに戻った後にこのメソッドが呼び出された場合
createListener
指定されたAsyncListenerクラスをインスタンス化します。返された AsyncListener インスタンスは、
addListenerメソッドの 1 つを呼び出して、この AsyncContext に登録する前にさらにカスタマイズできます。指定された AsyncListener クラスは、インスタンス化に使用されるゼロ引数コンストラクターを定義する必要があります。
指定された clazz がマネージド Bean を表す場合、このメソッドはリソースインジェクションをサポートします。マネージド Bean とリソースインジェクションの詳細については、Jakarta EE プラットフォームと CDI の仕様を参照してください。
このメソッドは、AsyncListener に適用可能なすべてのアノテーションをサポートします。
- 型パラメーター:
T- インスタンス化するオブジェクトのクラス- パラメーター:
clazz- インスタンス化する AsyncListener クラス- 戻り値:
- 新しい AsyncListener インスタンス
- 例外:
ServletException- 指定された clazz のインスタンス化に失敗した場合
setTimeout
void setTimeout(long timeout) この AsyncContext のタイムアウト(ミリ秒単位)を設定します。タイムアウトは、
ServletRequest.startAsync()メソッドの 1 つが呼び出されたときにコンテナーが開始したディスパッチがコンテナーに戻ると、この AsyncContext に適用されます。complete()メソッドもディスパッチメソッドも呼び出されない場合、タイムアウトになります。ゼロ以下のタイムアウト値は、タイムアウトがないことを示します。setTimeout(long)が呼び出されない場合、コンテナーのデフォルトのタイムアウトが適用されます。これは、getTimeout()の呼び出しを介して利用できます。デフォルト値は
30000ms です。- パラメーター:
timeout- ミリ秒単位のタイムアウト- 例外:
IllegalStateExceptionSE-ServletRequest.startAsync()メソッドの 1 つが呼び出されたコンテナー起動のディスパッチがコンテナーに戻った後にこのメソッドが呼び出された場合
getTimeout
long getTimeout()この AsyncContext のタイムアウト(ミリ秒単位)を取得します。このメソッドは、非同期操作のコンテナーのデフォルトのタイムアウト、または
setTimeout(long)の最新の呼び出しに渡されたタイムアウト値を返します。ゼロ以下のタイムアウト値は、タイムアウトがないことを示します。
- 戻り値:
- ミリ秒単位のタイムアウト