Tomcat 0が最速は嘘?

2010-10-26 追記: 現在のバージョンでは0が最速になっているとのことです。以下古い情報なのでご注意を。 前にどっかで、load-on-startupに0を指定した場合、一番最初に起動される訳じゃないという記述を読んだ気がしていました。 その記事を探そうと思ってgoogleで探してみると、load-on-startupに0を指定すれば一番最初に起動されるという記述が多かったです。?? 本当はどっちなんだろうか。ということで、ちょこっとソースを見ることにしました。 tomcat 5.0.28のソースをgrepしたら、以下のところで、loadOnStartup判定して、load処理を呼出してるようでした。

./jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java

/**
 * Load and initialize all servlets marked "load on startup" in the
 * web application deployment descriptor.
 *
 * @param children Array of wrappers for all currently defined
 *  servlets (including those not declared load on startup)
 */
public void loadOnStartup(Container children[]) {
    // Collect "load on startup" servlets that need to be initialized
    TreeMap map = new TreeMap();
    for (int i = 0; i < children.length; i++) {
        Wrapper wrapper = (Wrapper) children[i];
        int loadOnStartup = wrapper.getLoadOnStartup();
        if (loadOnStartup < 0)
            continue;
        if (loadOnStartup == 0)   // Arbitrarily put them last
            loadOnStartup = Integer.MAX_VALUE;
        Integer key = new Integer(loadOnStartup);
        ArrayList list = (ArrayList) map.get(key);
        if (list == null) {
            list = new ArrayList();
            map.put(key, list);
        }
        list.add(wrapper);
    }
    // Load the collected "load on startup" servlets
    Iterator keys = map.keySet().iterator();
    while (keys.hasNext()) {
        Integer key = (Integer) keys.next();
        ArrayList list = (ArrayList) map.get(key);
        Iterator wrappers = list.iterator();
        while (wrappers.hasNext()) {
            Wrapper wrapper = (Wrapper) wrappers.next();
            try {
                wrapper.load();
            } catch (ServletException e) {
                getServletContext().log
                    (sm.getString("standardWrapper.loadException",
                              getName()), e);
                // NOTE: load errors (including a servlet that throws
                // UnavailableException from tht init() method) are NOT
                // fatal to application startup
            }
        }
    }
}
これを見る限りloadOnStartupが、0だったら、Integer.MAX_VALUE を代入しているような。。。 そのloadOnStartupをTreeMapのkeyにしてるので、load-on-startupに0を指定したら起動が遅くなるということになる。 いろんなところに書いてあること(0が最速)が嘘になるんじゃないかな?
(4) では、Velocityサーブレットが正しい時間にロードされるように、load-on-startupタグを設定しています。0以上の任意の値であれば、コンテナーはそのinit()メソッドを呼ぶことによって、サーブレットをロードします。load-on-startupタグのボディーの中に置かれた値が、様々なサーブレットを呼ぶ順番を決定します。例えば0は1の前に呼ばれ、1は2の前に呼ばれます。タグを省略すると、あるいはマイナスの値を使うと、サーブレット・コンテナーはいつでも自分が好きな時にサーブレットをロードできるようになります。 http://www-06.ibm.com/jp/developerworks/java/051014/j_j-sr1.shtml
IBMが間違ってること言ってるってのも考えにくいし、サーブレットコンテナによって(WebSphereとTomcatで)違うとか、versionによって違うとか?(そんなことあるのか?)。 ちゃんと全部を読んだ訳ではないので不安です…。詳しい方、是非、突っ込みお願いします。 一番早いのは実験することですが。。。

2件のコメント

  • tomcat6.0で確認したところ、load-on-startupに0を指定した場合が一番起動が早かったです。 どうやら0以上を指定すると若い順から呼ばれ、負の値を指定すると起動時には呼ばれない(リクエスト時に呼ばれる)みたいです。 ちなみにJavaEE5対応のSJC-WC試験の問題でも0が最速とのことでした。

  • 以前は、実際にTomcat5のソースで、load-on-startupが0が最速にならなかったのは事実でした。実験(http://blog.starbug1.com/archives/63)の結果も同様でした。 load-on-startupが0が最速にならないのは、Tomcat5のバグだったのかもしれないですね。そこまで調べようと思いませんが。

    どちらにしてもこのエントリは古い情報なので、注意書きを入れときました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください