2012-11-18 5 views
14

リンクhttp://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20によると、destroyメソッドの呼び出し理由の1つは、サーブレットが長時間に要求を受けていない場合はです。サーブレットのdestroyメソッドの呼び出し

私は長い間呼ばれていないページがあると思っていました。だから、それは破壊が呼び出され、もはや使われなくなるということですか?

実際に、私はこの質問をインタビューで尋ねられました。彼は、サーバーをシャットダウンするときにのみ破壊メソッドが呼び出されると教えてくれました。

これに関するお手伝いをお待ちしております。

+3

私はあなたがサーブレットを殺すのはあなただとは思わない。あなたの責任ではないはずです。そのため、サーブレット・コンテナ内にあり、サーブレットは管理対象リソースです – kolossus

答えて

0

これは、古典的な仕様対実装のものの1つです。 Tomcatのようなサーブレット・コンテナは、サーブレット・オブジェクトのプールを維持するために仕様によって許可され、ロードが増減するにつれてそれらを作成および破棄します。この種の設定では、特定のインスタンスが不要になったときにdestroyが呼び出されます。リクエストごとに新しいインスタンスを作成し、リクエストが処理される直前にinitを呼び出し、直後に破棄することもできます。

実際には、ほとんどすべてのサーブレットコンテナは、各サーブレットのインスタンスを正確に1つ保持します。サーブレットはスレッドセーフである必要があるため、これも完全に問題ありません。このシナリオでは、destroyはコンテキストがシャットダウンされたときにのみ呼び出されます。

私はサーブレットをプールしたいと思うことはたくさんありますが、それは仕様によって許されています。仕様(The Servlet Interface -> Servlet Life Cycle -> End of Service)から

3

破壊する方法は、コンテナは、サーブレットのインスタンスにルーティング 他の要求をせず、サーブレットインスタンスに対して呼び出された後。コンテナが サーブレットを再度有効にする必要がある場合は、サーブレットのクラスの新しいインスタンスを使用してサーブレットを実行する必要があります。

この仕様では、破棄されているサーブレットの特定のインスタンスを参照しています。

これは、破壊が呼び出され、使用されなくなることを意味しますか?

インスタンスが破棄されたサーブレットが使用されることはありません。ガベージコレクションのように使用されていないのは、その特定のインスタンスだけです。そのサーブレットの要求が到着すると、そのサーブレットの新しいインスタンスがコンテナによって作成され、要求を処理するまでのライフサイクルアクションがすべて実行されます。

0

これは、使用しているサーブレットコンテナの実装に完全に依存します。サーブレットコンテナがリソースを節約するために非常に控えめである場合、長期間サービスを行っていないサーブレットを破壊する可能性があります。

サーブレット仕様2.5の22ページでは、「サーブレットコンテナがサーブレットをサービスから削除する必要があると判断した場合、Servletインターフェイスのdestroyメソッドを呼び出して、サーブレットがリソースを解放できるようにします永続状態を使用して保存しています。たとえば、メモリリソースを節約したいときや、シャットダウンするときにコンテナがこれを行うことがあります。Javaサーブレット、destroy()

はプログラマによって呼び出されることになっていません。しかし、それが呼び出された場合、それが実行されます」

9

私の知る限り、。暗黙の質問は、サーブレットが破棄されますか?いいえ、そうではありません。destroy()方法がに想定されていないとJavaサーブレットを破壊しないであろう。

コンテナはサーブレットを破壊することを決定したときにJavaサーブレットでdestroy()の意味は、コンテンツが直前に実行されますされます。しかし、あなたが起動している場合destroy()メソッドを実行すると、コンテンツが実行された後、それぞれのプロセスが続行されます。この質問に対して、destroy()が実行され、サーブレットの初期化が完了します。

destroy()メソッドが最初に呼び出された後、サーブレットがコンテナから削除され、最終的にガベージコレクションされます。 destroy()メソッドには、ガベージコレクションされないJDBC接続のようなリソースを解放するためのコードが含まれています。

0

Servlet.destroy()のjavadocは、「サーブレットがサービスを停止していることをサーブレットに示すためにサーブレットコンテナによって呼び出されます。サーブレットがどのような状況で「サービス停止」されるのかを指定するのではなく、必要に応じて応答できるイベントです。たとえば、開いているリソースをいくつかクローズしたり、状態をストレージに保存したりすることができます。

最も顕著な理由は、サーブレットコンテナがシャットダウンされていることですが、コンテナは、サーブレットが月に使用されておらず、単にリソースを消費しているため、サーブレットをアンロードする時間と同等に判断できます。その振る舞いは完全に実装次第であり、(サーブレット設計者として)あなたが気にするべきものではありません。症例の

3

カップル:

  1. 容器がシャットダウンまたはアプリケーションがシャットダウンします。
  2. コンテナがメモリ不足と判断した場合。
  3. このサーブレットが長い時間リクエストを受けていない場合。ドク

    サーブレットがサービスから取り出されているサーブレットに示すために、サーブレットコンテナによって呼び出され

    1として

。このメソッドは、サーブレットのサービスメソッド内のすべてのスレッドが終了するか、 のタイムアウト時間が経過した後にのみ、一度だけ呼び出されます。サーブレットコンテナがこの メソッドを呼び出した後、このサーブレットでサービスメソッドを再度呼び出すことはありません。

0

サーブレットのdestroyメソッドはコールバックです。これらは、特定のイベントが起きようとしているときにコンテナによって呼び出される関数です(この場合、サーブレットは破棄される予定です)。したがって、目的は、あなたが何かをしたい場合(例えば、リソースをクリーンアップするなど)、このコールバックのもとで行うことができます。