StandardServerのinitInternalメソッドが実行される際、StandardService#initが呼び出され、その後initInternalメソッドが実行されます。
protected void commenceInternal() throws LifecycleException {
if(logger.isInfoEnabled())
logger.info(messageUtil.getString("service.commence.identifier", this.identifier));
setPhase(LifecyclePhase.COMMENCING);
// まず定義されたコンテナを起動
if (coreEngine != null) {
synchronized (coreEngine) {
// エンジンコンポーネントの起動
coreEngine.commence();
}
}
synchronized (threadExecutors) {
for (TaskExecutor executor: threadExecutors) {
executor.commence();
}
}
// マッパーコンポーネントの初期化、ホスト、コンテキスト、ラッパーのマッピング関係を設定
mappingListener.commence();
// 次に定義されたコネクタを起動
synchronized (connectionLock) {
for (NetworkLink connector: connectionLinks) {
try {
// すでに失敗している場合は起動を試みない
if (connector.getPhase() != LifecycleState.FAILED) {
// 接続関連コンポーネントの初期化
connector.commence();
}
} catch (Exception e) {
logger.error(messageUtil.getString(
"service.link.startFailed",
connector), e);
}
}
}
}
マッパーコンポーネントの主な機能は、リクエストパスのルーティングマッピングを提供し、特定のリクエストパスを計算を通じて対応するサーブレット(ラッパー)に導くことです。
マッピングには、ホストコンテナ、コンテキストコンテナ、ラッパーコンテナなどのマッピング関係とマッピングアルゴリズムが含まれます。
1つのサービスコンテナにはN個のホストコンテナの参照が含まれ、各ホストにはN個のコンテキストコンテナの参照があり、最後に各コンテキストコンテナにはN個のラッパーコンテナの参照が含まれます。ラッパーコンテナは具体的なサーブレットを見つけます。
Tomcatが起動して安定した後、これらのマッピングはすべて整理されていますが、具体的に対応するコンテナをどのように見つけるのでしょうか?
- ホストのマッチング: マッパーのホストマッピング配列で大文字小文字を無視する二分探索検索を行います。
- コンテキストのマッチング: 見つかったホストマッピングのコンテキストマッピング配列で大文字小文字を無視する二分探索検索を行います。ここで特別なケースとして、リクエストアドレスがコンテキスト名で直接終わる場合があります(例: http://tomcat.apache.org/tomcat-7.0-doc)。また、他の場合はhttp://tomcat.apache.org/tomcat-7.0-do/index.htmlのような形式です。さらに、コンテキストマッピングの名前はコンテキストコンテナのpathプロパティに対応します。
- ラッパーのマッチング: まず、正確な一致を使用して正確なタイプのサーブレットのパスを試行します。次に、ワイルドカードタイプのサーブレットの接頭辞一致を試行します。次に、拡張子一致を使用してワイルドカードタイプのサーブレットを試行します。最後に、デフォルトサーブレットに一致させます。
Tomcatがリクエストを処理する際のルーティング分散はすべてマッパーコンポーネントが担当し、リクエストはマッパーを通じて最終的な処理サーブレットまたはリソースを見つけます。Tomcatには2種類のマッパーがあり、それらの作用範囲が異なるため、グローバルルーティングマッピングとローカルルーティングマッピングと呼ばれます。