まず、Tomcatを起動し、何が行われたかのさまざまなコンポーネント
実行startup.shスクリプトは、Tomcatを開始したとき、
1、Tomcatは基本的にJavaプログラムなので、startup.shスクリプトは、Tomcatを実行するために、起動クラスブートストラップJVMを開始します
2、ブートストラップは、Tomcatのクラスローダを初期化し、そしてカタリナを作成しています
図3は、カタリナは、server.xmlのを解析し、対応するコンポーネントを作成し、この方法は、サーバと呼ばれる開始することができ、起動クラスです。
4、サービス・コンポーネントを管理するために使用されるサーバーコンポーネントは、サービスの開始メソッドを呼び出すことができます
5、責任のサービス・コンポーネントは、最上位のコンテナのコネクタとエンジンの管理があり、それは、コネクタおよびエンジン始動メソッドを呼び出すことができます
二、カタリナ
Tomcatが起動するようカタリナタスクが、それはserver.xmlを解析して、サーバーを作成することで、server.xmlで構成された個々の構成要素のうち、作成された、そして、initメソッドとstartメソッドServerコンポーネントを呼び出します。
公共 のボイドスタート(){ // ホルダーが空の場合、それはserver.xmlを作成し解析します。1. Serverインスタンス のIF(単にgetServer()== nullの){ ロード(); } // 2.作成に失敗した場合は、エラーを終了 IF(単にgetServer()== nullの){ log.fatal(sm.getString(" catalina.noServer " )); リターン; } // 3.開始サーバー 試し{ 単にgetServer()(スタート);. } キャッチ(LifecycleException E){ 返す; } //はシャットダウンフックを作成して登録します もし(useShutdownHook){ 場合(shutdownHook == NULL ){ shutdownHook = 新しいCatalinaShutdownHook()。 } 。Runtime.getRuntime()addShutdownHook(shutdownHook)。 } // 用のawait方法监听停止请求 場合(のawait ){ のawait ()。 やめる(); } }
だから、Tomcatはどのように停止し、リソースをクリーンアップするのですか?
閉じたときにまず、「閉鎖フック」を登録するにはJVMでカタリナは、フックは、ディスクへのブラシのキャッシュされたデータとして、いくつかのクリーンアップを行うことができます。このフックは、実際のスレッドで、JVMは、このスレッドを実行する方法を停止する前に実行しようとします。
CatalinaShutdownHook:
保護された クラスCatalinaShutdownHookは、Thread {拡張 @Override 公共 ボイドラン(){ しようと{ 場合(単にgetServer()!= nullの){ カタリナを。この.stop(); } } キャッチ(ThrowableのEX){ ... } } }
「オフフック」TomcatはstopメソッドServerはすべてのリソースを解放し、クリーンアップ、実際に方法サーバーの実装上の停止です。
三、サーバーコンポーネント
特定の実装クラス:StandardServer。
サブアセンブリServerはサービスなので、サービスのライフサイクルを管理することです。サーバーが起動すると、あなたは、メソッド・サービス・コンポーネントを起動する呼び出しあなたが停止したときに停止するようにそれらのメソッドを呼び出す必要があります。サーバーは、内部的に、配列を保存するために、サービス・コンポーネントを維持しています。サーバーは、どのように配列にサービスを追加するには?
@Override 公共 ボイドにaddService( -サービス-サービス){ service.setServer(この); 同期(servicesLock){ // 新しい配列の長さを作成+ -サービスは= []結果新しい新しい -サービス[services.length用+ 1 ]; // 意志過去の古いデータ複製 System.arraycopyの(サービス、0、結果、0 ;、services.length) 結果[services.length] = サービス; サービス = 結果は; // サービスコンポーネントを起動 IF (getStateを()isAvailable()。) { 試み{ service.start(); } キャッチ(LifecycleException E){ // 無視 } } // トリガ・イベントリスナー support.firePropertyChange(" -サービス"、NULL 、 -サービス); } }
四、サービスコンポーネント
サービス実装クラスコンポーネント:StandardService。
パブリック クラスを実装し、サービス{LifecycleBase拡張StandardService // 名前 プライベート文字列名= nullの; // Serverインスタンス プライベートサーバサーバ= ヌル; // コネクタ配列 保護コネクタコネクタ[] = 新しい新しいコネクタ[ 0 ]; プライベート最終的なオブジェクトのconnectorsLock = 新新オブジェクト(); // 対応するコンテナエンジン 専用エンジンエンジン= ヌル; // マッパーとリスナーが 保護された最終マッパーマッパー= 新新マッパー(); 保護された最終MapperListener mapperListener = 新しい MapperListener(本)
コンポーネントがStandardServiceを見ることができる:コネクタ、エンジン、マッパー、MapperListener(Webアプリケーション配備の変更はマッパー内の情報を更新する場合、リスナーであり、ホットデプロイを使用します)。
起動方法でStandardService:
保護された 無効startInternal(){LifecycleExceptionスロー // 1.リスナーを開始するためのトリガ SETSTATE(LifecycleState.STARTINGを); // 2.まずエンジン始動、エンジンはそのサブコンテナを開始し たIF(エンジン=!ヌル){ {同期(エンジン) engine.start(); } } // 3.マッパー再始動リスナー mapperListener.start(); // 4.最後にコネクタを開始、コネクタサブアセンブリは、それが開始され、そのようなエンドポイント 同期(connectorsLock){ 用(コネクタコネクタ:コネクタ){ IF!(connector.getState()= LifecycleState.FAILED){ connector.start(); } } } }
ブートシーケンス注:最初Engineコンポーネントを起動し、マッパーリスナーを開始し、最終的にコネクタを開始します。(第一の内側層に沿って、外側の層)
五、エンジンコンポーネント
実装クラス:StandardEngineでは、エンジンは、本質的に基本クラスを継承ContainerBase容器、であり、インタフェースエンジンを実装します
パブリック クラスStandardEngineでは{ContainerBaseエンジンを実装して延びています }
エンジンサブコンテナは、アレイホスト容器を保持するホストであります
CatalinaShutdownHook
オタクタイム著作権:https://time.geekbang.org/column/article/97603: