JBossBookの2.4.1にもあるけど
org.jboss.Main → org.jboss.system.server.ServerImpl が流れの軸
- org.jboss.Main#main()からスタート
- コマンドラインからプロパティを読み込み
- org.jboss.system.server.ServerLoaderを初期化
- ServerLoaderがServerをインスタンス化*1(デフォルトでorg.jboss.system.server.ServerImpl)
- Server#init(props)
- Server#start()*3
- MBeanServerBuilder:デフォルトでorg.jboss.mx.server.MBeanServerBuilderImpl
- MBeanServer:MBeanServerFactory#createMBeanServer()で、AccessController.doPrivileged()とか通してorg.jboss.mx.server.MBeanServerImplをインスタンス化する。こいつがJMXの中核。コンストラクタでMBeanRegistry初期化&レジストリ自身を表すModelMBeanを登録、クラスローダリポジトリMBean(デフォルトでorg.jboss.mx.loading.UnifiedLoaderRepository3)を登録
- MBeanServer#registerMBean()でガンガンMBeanを登録:ServerImplMBean、ServerConfigImplMBean、bootstrapUCL*4
- MBeanを生成、登録:org.jboss.system.server.ServerInfo、org.jboss.system.ServiceController
- MBeanを生成、登録、サービススタート:org.jboss.deployment.MainDeployer、org.jboss.deployment.JARDeployer、org.jboss.deployment.SARDeployer
- ShutdownHook(スレッド)も登録
- ここまでで"Core system initialized"ログ
- MainDeployerMBean(プロキシ)でserver/default/conf/jboss-service.xmlをデプロイ!…ここで全サービスの起動シーケンスが処理される
- LifeThreadスタート←何もしないスレッド
- スタートNotificationを各NotificationListener(各サービスが実装している)にsend → 各サービスが活動開始!
- "JBoss (MX MicroKernel) [4.0.2 (build: CVSTag=JBoss_4_0_2 date=200505022023)] Started in 15s:47ms"ログ
- mainスレッド終了〜
クラスローダリポジトリがMBeanになっているあたりが印象的。MBean経由でクラスローダ作るのはどうも面倒くさそうなんだけど。
Server#start()があっさりしたつくりになっているのは、ほとんどの機能が「サービス」として分離されているから。エライ
このへんが重要
- MBeanServerImpl:MBeanの登録、呼び出し
- ServiceController:サービスのライフサイクルなど管理
- MainDeployer:なんでもデプロイ(SARDeployerとかに委譲するけど)
稼動した各サービスの起動シーケンスも調べたいけど…追々やるということで