web-dev-qa-db-ja.com

サーブレットの<load-on-startup>値の意味

ここで少し混乱しています。このアプリケーションでは、いくつかのサーブレットを定義しています。以下は、サーブレットの1つに関する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>の値は、自動的にロードされるためには正の整数でなければなりません。私はグーグルで調べたが、出会った回答は混乱を増しただけだった。

169
Vini

Resin 3. この動作を文書化します:

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

JSP 3.1 spec (JSR 340)は、14-160ページでこれを述べています。

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

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

178
Eddie

Short Answer:value> = 0は、Webアプリのデプロイ時またはサーバーの起動時にサーブレットがロードされることを意味します。値<0:コンテナが次のように感じるたびにサーブレットがロードされます。

ロングアンサー(仕様から):

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

128
Nils Magnus

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

Load-on-startupがゼロ以上の場合、コンテナの起動時に、そこに配置した起動時のロード値の昇順(0、1、2、5、10など)でそのサーブレットが起動されます。 。

11
cletus

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

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

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

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

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

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

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

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

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

他の答えとこれに記載されているように、この load-on-startup article ゼロは許容でき、他のサーブレットがない場合は、これがロード中に優先され、デプロイメント中にロードされます。ロードオンstatupの最適な使用方法は、接続プールを作成したり、ネットワーク呼び出しを行ったり、大きなリソースを保持したりするサーブレットのように、最初のリクエストが来る前に初期化に時間がかかるサーブレットをロードすることです。これにより、最初のいくつかのリクエストの応答時間が大幅に短縮されます。

1
Suresh Pradhan

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

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

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

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

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

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

0
anil paritala

はい、同じ値を持つことができます。..起動時にロードに番号を付ける理由は、サーバーがすべてのサーブレットをロードするシーケンスを定義するためです。 load-on-startup値が0のサーブレットが最初にロードされ、値1のサーブレットがその後ロードされます。

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

0
Bharat Patel