サーブレットの<load-on-startup>値は何を意味しますか


174

ここで少し混乱しています。このアプリケーションでは、いくつかのサーブレットを定義しています。以下は、web.xmlサーブレットのからの抜粋です。

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

私が理解して<load-on-startup>いるように、自動的に読み込まれるためには、の値は正の整数でなければなりません。私はグーグルで調べましたが、私が遭遇した応答は私の混乱に追加されました。

回答:


186

Resin 3.0はこの動作を文書化しています:

load-on-startupは(オプションの)整数値を指定できます。値が0以上の場合は、サーブレットがロードされる順序を示します。数値が大きいサーブレットが、数値が小さいサーブレットの後にロードされます。

JSP 3.1仕様(JSR 340)は、ページ14から160にこれを言います:

要素load-on-startupは、このサーブレットがWebアプリケーションの起動時に読み込まれる(インスタンス化され、そのinit()が呼び出される)必要があることを示します。この要素の要素コンテンツは、サーブレットをロードする順序を示す整数である必要があります。値が負の整数の場合、または要素が存在しない場合、コンテナは選択するたびにサーブレットを自由にロードできます。値が正の整数または0の場合、コンテナーは、アプリケーションのデプロイ時にサーブレットをロードして初期化する必要があります。コンテナは、より高い整数でマークされたサーブレットがロードされる前に、より低い整数でマークされたサーブレットがロードされることを保証する必要があります。コンテナは、同じload-on-startup値を持つサーブレットのロードの順序を選択できます。

JSRだけでなく、Webコンテナのドキュメントも確認する必要があります。違いがあるかもしれません


クレタスは彼の答えが間違っている。投稿を編集することを検討してください。
Alboz、2015

3
起動時の負荷を指定しないとどうなりますか?
Nirmal

1
@Nirmal 2番目の段落では、要素が存在しない場合、要素が負の場合と同じ動作をすることを指定しています。つまり、コンテナは、選択するたびにサーブレットを自由にロードできます。
Finnegan

129

短い回答:値> = 0は、Webアプリがデプロイされたとき、またはサーバーが起動したときにサーブレットがロードされることを意味します。値<0:コンテナの感覚に合わせてサーブレットがロードされます。

長い答え(仕様から):

load-on-startup要素は、このサーブレットがWebアプリケーションの起動時に読み込まれる(インスタンス化され、そのinit()が呼び出される)ことを示します。これらの要素のオプションの内容は、サーブレットをロードする順序を示す整数である必要があります。値が負の整数の場合、または要素が存在しない場合、コンテナは、選択するたびにサーブレットを自由にロードできます。値が正の128整数または0の場合、コンテナーは、アプリケーションのデプロイ時にサーブレットをロードして初期化する必要があります。コンテナは、より高い整数でマークされたサーブレットがロードされる前に、より低い整数でマークされたサーブレットがロードされることを保証する必要があります。コンテナは、同じload-on-start-up値を持つサーブレットのロード順序を選択できます。


1
そして、なぜ私たちが..アプリケーションの起動時最初にそれをロードする順序どおりのDispatcherServletに0をマークしていること
ラッキー

11

これは、リクエストがサーブレットにアクセスしようとするまで、サーブレットが開始されないことを示しています。

load-on-startupがゼロ以上の場合、コンテナーが起動すると、コンテナーはそこに配置した起動時の負荷の値の昇順でサーブレットを起動します(つまり、0、1、2、5、10など)。 。


7
ゼロもロードを引き起こします。「[...]値が正の整数または0の場合、アプリケーションのデプロイ時にコンテナがサーブレットをロードして初期化する必要があります。[...]」
marabol

1
私はそれを修正する方が良いと思う@cletus ゼロより大きいのゼロ以上受け入れられた1あたりに示されるように、多くのユーザーがあなたの答えを読んでいるので、。前もって感謝します
Tarik

9

サーブレットのライフサイクル

サーブレットのライフサイクルは、サーブレットがデプロイされているコンテナによって制御されます。リクエストがサーブレットにマッピングされると、コンテナは次の手順を実行します。

  1. サーブレットのインスタンスが存在しない場合、Webコンテナは次のことを行います。

    a。サーブレットクラスをロードします

    b。サーブレットクラスのインスタンスを作成します

    c。initメソッドを呼び出してサーブレットインスタンスを初期化します(初期化については、「サーブレットの作成と初期化」で説明しています)。

  2. コンテナーはサービスメソッドを呼び出し、要求オブジェクトと応答オブジェクトを渡します。サービスメソッドについては、サービスメソッドの記述で説明しています。

値0 load-on-startupは、リクエストがそのサーブレットに到達したときにポイント1が実行されることを意味します。その他の値は、ポイント1がコンテナーの起動時に実行されることを意味します。


完璧な答え!
gaurav

1

他の回答とこの起動時のロードに関する記事で述べたように、ゼロは受け入れ可能であり、他のサーブレットがない場合は、これがロード時に優先され、デプロイメント中にロードされます。ロードオンstatupの最適な使い方は、接続プールを作成したり、ネットワーク呼び出しを行ったり、かさばるリソースを保持したりするサーブレットのように、最初のリクエストが来る前に初期化に時間がかかるサーブレットをロードすることです。これにより、最初のいくつかのリクエストの応答時間が大幅に短縮されます。


1
  1. 2つのサーブレットの値が同じである場合、それらはweb.xmlファイル内で宣言された順序でロードされます。
  2. が0または負の整数の場合、コンテナがそれらをロードしようとするときにサーブレットがロードされます。
  3. Webコンテナによるサーブレットのロード、初期化、およびinit()メソッドの呼び出しを保証します。
  4. サーブレットの要素がない場合は、Webコンテナがそれらをロードすることを決定したときに読み込まれます。

0

はい、同じ値にすることができます。load-on-startupに数値を与える理由は、サーバーがすべてのサーブレットをロードするシーケンスを定義するためです。load-on-startup値が0のサーブレットが最初にロードされ、値が1のサーブレットがその後にロードされます。

2つのサーブレットがload-on-startupに同じ値を持つ場合は、web.xmlで上から下に宣言された方法でロードされるものよりもロードされます。web.xmlで最初に来るサーブレットが最初にロードされ、もう1つはその後にロードされます。


0

->(load-on-start-upが存在しない)タグまず最初に、サーブレットがサーバーにデプロイされるとき、サーブレットオブジェクトを作成するのはサーバーの責任です。例:サーブレットがサーバーにデプロイされているとします(サーブレットオブジェクトはサーバーでは使用できません)。クライアントが初めてサーブレットにリクエストを送信し、サーバーがデフォルトコンストラクターを使用してサーブレットオブジェクトを作成し、すぐにinit()を呼び出します。それから、クライアントがリクエストを送信すると、オブジェクトがすでに利用可能であるため、サービスメソッドのみが実行されます

load-on-start-upタグがデプロイメント記述子で使用されている場合:デプロイメント自体の時点で、サーバーはタグの間に指定された正の値に基づいてサーブレットのサーブレットオブジェクトを作成します。サーブレットクラスのオブジェクトの作成は0〜128の範囲で行われます。最初にサーブレットが作成され、その後に他の番号が作成されます。

web.xmlの2つのサーブレットに同じ値を指定すると、web.xmlのクラスの位置に基づいてオブジェクトの作成が行われ、サーバーによっても異なります。

起動タグのロードの間に負の値を指定すると、サーバーはサーブレットオブジェクトを作成しません。

サーバーがサーブレットのオブジェクトを作成するその他のシナリオ。

web.xmlの起動タグでロードを使用しない場合、サーバーがオブジェクトを作成し、サーバーがそのライフサイクルメソッドの呼び出しを担当するときに、クライアントがリクエストを初めて送信するときにプロジェクトがデプロイされます。次に、サーバー(tomcat)で.classが変更された場合。再びクライアントは変更されたサーブレットのリクエストを送信しますが、tomcatの場合、新しいオブジェクトは作成されず、サーバーの再起動が行われない限り、サーバーは既存のオブジェクトを利用します。しかし、web-logicのクラスでは、リクエストを受信した場合にサーバーを再起動せずにサーバーで.classファイルが変更されると、サーバーは既存のサーブレットでdestroyメソッドを呼び出し、新しいサーブレットオブジェクトを作成して初期化のためにinit()を呼び出します。


-1

値が<0の場合、リクエストが来たときにSerletがインスタンス化されます。それ以外の場合は、値が大きい順にコンテナーがロードされます。2つ以上のサーブレットが同じ値を持つ場合、web.xmlで宣言されたサーブレットの順序。


-2

サーブレットコンテナは、起動時または最初のリクエストが行われたときにサーブレットをロードします。サーブレットのロードは、「web.xml」ファイルの「load-on-startup」属性に依存します。属性に正の整数(0〜128)がある場合、サーブレットはコンテナの読み込みとともに読み込まれます。そうでない場合は、最初のリクエストがサービスのために読み込まれたときに読み込まれます。

リクエストを受け取ったサーブレットがロードされると、「遅延ロード」と呼ばれます。


-6

予想もしないほど簡単です。

値が正の場合、コンテナの起動時に読み込まれます

値が正でない場合、要求が行われたときにサーブレットがロードされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.