リンク http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/2 によると、destroyメソッドを呼び出す理由の1つはサーブレットが長い間リクエストを受け取らなかった場合。
長く呼ばれないページもあるのではないかと思っていました。つまり、destroyが呼び出され、使用されなくなるということですか?
実際、インタビューでこの質問をされたところ、サーバーがシャットダウンされたときにのみdestroyメソッドが呼び出されるとのことでした。
これに関する助けに感謝します。
私の知る限り、
Javaサーブレットでは、destroy()
はプログラマーによって呼び出されることは想定されていませんが、呼び出されると実行されます。暗黙の質問は、サーブレットが破棄されるかどうかです。 ?いいえ、そうではありません。destroy()
メソッドは、Javaサーブレットを破壊することは想定されておらず、破壊されません。
Javaサーブレットでのdestroy()
の意味は、コンテナがサーブレットを破棄することを決定する直前にコンテンツが実行されることです。ただし、destroy()
メソッドを呼び出すとあなた自身、コンテンツが実行された後、それぞれのプロセスが続行されます。この質問に応じて、destroy()
が実行され、サーブレットの初期化が完了します。
destroy()
メソッドが最初に呼び出され、次にサーブレットがコンテナから削除され、最終的にガベージコレクションが行われます。 destroy()
メソッドには通常、ガベージコレクションされないJDBC接続などのリソースを解放するためのコードが含まれています。
いくつかのケース:
Docによると
サーブレットコンテナによって呼び出され、サーブレットがサービスを停止していることをサーブレットに示します。このメソッドは、サーブレットのサービスメソッド内のすべてのスレッドが終了したとき、またはタイムアウト期間が経過した後にのみ呼び出されます。サーブレットコンテナがこのメソッドを呼び出した後、このサーブレットでサービスメソッドを再度呼び出すことはありません。
仕様から(The Servlet Interface -> Servlet Life Cycle -> End of Service
):
サーブレットインスタンスでdestroyメソッドが呼び出されると、コンテナは他のリクエストをサーブレットのそのインスタンスにルーティングできなくなります。コンテナがサーブレットを再度有効にする必要がある場合は、サーブレットのクラスの新しいインスタンスを使用して有効にする必要があります。
仕様は、破棄されているサーブレットの特定のインスタンスを参照しています。
つまり、destroyが呼び出され、使用されなくなるということですか?
インスタンスが破棄されたサーブレットが使用されないという意味ではありません。ガベージコレクションされたために使用されないのは、その特定のインスタンスだけです。そのサーブレットにリクエストが届くと、コンテナはそのサーブレットの新しいインスタンスを作成し、リクエストを処理するまですべてのライフサイクルアクションを実行します。
これは、それらの古典的な仕様と実装の1つです。 Tomcatのようなサーブレットコンテナは、仕様によりサーブレットオブジェクトのプールを維持し、負荷が増減するときにそれらを作成および破棄することが許可されています。この種のセットアップでは、特定のインスタンスが不要になったときにdestroyが呼び出されます。リクエストごとに新しいインスタンスを作成し、リクエストが処理される直前にinitを呼び出し、直後に破棄することも合法です。
ただし、実際には、事実上すべてのサーブレットコンテナが各サーブレットのインスタンスを1つだけ維持します。サーブレットはスレッドセーフである必要があるため、これも完全に問題ありません。このシナリオでは、destroyはコンテキストがシャットダウンされたときにのみ呼び出されます。
サーブレットをプールしたい場合はあまり考えられませんが、仕様では許可されています。
サーブレットのdestroyメソッドはコールバックです。これらは、特定のイベントが発生しようとしているときにコンテナによって呼び出される関数です(この場合、サーブレットは破棄されようとしています)。したがって、全体の目的は、何かを実行したい場合(たとえば、リソースのクリーンアップ)、このコールバックの下でそれらを実行できることです。
Servlet.destroy() のjavadocによると、「サーブレットコンテナによって呼び出され、サーブレットがサービスを停止していることをサーブレットに示します」。これは、サーブレットが「サービス停止」になる状況を指定するものではなく、必要に応じて対応できるイベントにすぎません。たとえば、開いているリソースを閉じたり、状態をストレージに保持したりできます。
これの最も明白な理由は、サーブレットコンテナがシャットダウンされていることですが、サーブレットは1か月間使用されておらず、単にリソースを消費しているため、コンテナはサーブレットをアンロードする時期であると同様に判断できます。この動作は完全に実装次第であり、(サーブレット設計者としての)あなたが心配する必要はありません。
使用しているサーブレットコンテナの実装に完全に依存します。サーブレットコンテナがリソースを節約するために非常に保守的である場合、長期間使用されていないサーブレットを破壊する可能性があります。
サーブレット仕様2.5の22ページに、「サーブレットコンテナは、サーブレットをサービスから削除する必要があると判断すると、サーブレットインターフェイスのdestroyメソッドを呼び出して、サーブレットが使用中のリソースを解放して保存できるようにします。任意の永続状態。たとえば、コンテナは、メモリリソースを節約したいとき、またはシャットダウンしているときにこれを行うことができます。」
サーブレット仕様から:-
destroy()メソッドはサーブレットコンテナによって呼び出され、サーブレットがサービスを停止していることをサーブレットに示します。このメソッドは、サーブレットのサービスメソッド内のすべてのスレッドが終了したとき、またはタイムアウト期間が経過した後にのみ呼び出されます。 サーブレットコンテナがdestroy()メソッドを呼び出した後、「THISSERVLET」でサービスメソッドを再度呼び出すことはありません。
サーブレットコンテナは、特定の期間、サーブレットをロードしたままにする必要はありません。サーブレットインスタンスは、ミリ秒の期間、サーブレットコンテナの存続期間(日、月、または年の数)、またはその間の任意の時間、サーブレットコンテナ内でアクティブに保たれる場合があります。
サーブレットコンテナは、サーブレットをサービスから削除する必要があると判断すると、サーブレットインターフェイスのdestroyメソッドを呼び出して、サーブレットが使用中のリソースを解放し、永続状態を保存できるようにします。たとえば、コンテナは、メモリリソースを節約したいとき、またはシャットダウンされているときにこれを行うことができます。
サーブレットコンテナがdestroyメソッドを呼び出す前に、サーブレットのサービスメソッドで現在実行されているスレッドが実行を完了するか、サーバー定義の制限時間を超えることができるようにする必要があります。
サーブレットインスタンスでdestroyメソッドが呼び出されると、コンテナは他のリクエストをサーブレットのそのインスタンスにルーティングできません。