タイムアウト後のAsyncContextの正確な動作は何ですか?それはまだ実行され、getResponse()を使用して応答を返しますか?
1 に答える
34 ページのJava Servlet 3.0メンテナンス リリースには次のように書かれています。
このメソッドへの呼び出し -
ServletRequest.startAsync(ServletRequest req, ServletResponse res)
- アプリケーションがサービス メソッドを終了するときに、応答がコミットされないようにします。返された AsyncContext で AsyncContext.complete が呼び出されるか、AsyncContext がタイムアウトし、タイムアウトを処理するためのリスナーが関連付けられていない場合にコミットされます。非同期タイムアウトのタイマーは、リクエストとそれに関連付けられたレスポンスがコンテナから返されるまで開始されません。AsyncContext を使用して、非同期スレッドからの応答に書き込むことができます。また、応答が閉じられておらず、コミットされていないことを通知するためにも使用できます。
javax.servlet.AsyncContext インターフェイスの javadocから:
非同期操作がタイムアウトした場合、コンテナーは次の手順を実行する必要があります。
- onTimeout メソッドで、非同期操作が開始された ServletRequest に登録されているすべての AsyncListener インスタンスを呼び出します。
- どのリスナーも complete() メソッドまたはどの dispatch() メソッドも呼び出していない場合は、HttpServletResponse.SC_INTERNAL_SERVER_ERROR に等しいステータス コードでエラー ディスパッチを実行します。
- 一致するエラー ページが見つからない場合、またはエラー ページが complete() メソッドまたはどの dispatch() メソッドも呼び出していない場合は、complete() を呼び出します。」
上記の最後の行は最も重要です - への呼び出しがありますAsyncContext.complete()
。javadoc は言う:
この AsyncContext の初期化に使用された要求で開始された非同期操作を完了し、この AsyncContext の初期化に使用された応答を閉じます。
AsyncContext
クローズすると、ほとんどのメソッドの呼び出しで がスローされますIllegalStateException
。