起動シーケンス

JBossBookの2.4.1にもあるけど
org.jboss.Main → org.jboss.system.server.ServerImpl が流れの軸

  • org.jboss.Main#main()からスタート
  • Server#init(props)
    • プロパティ設定、ロガー初期化*2
  • 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とかに委譲するけど)

稼動した各サービスの起動シーケンスも調べたいけど…追々やるということで

*1:NoAnnotationURLClassLoaderとやらにloadClass()させる

*2:org.jboss.logging.Loggerはorg.jboss.logging.Log4jLoggerPluginを介してLog4Jを使う。log4j.xml読むまでは、run.jarにあるlog4j.propertiesの設定←boot.logに出力とか

*3:initやstartのときに毎度、コンテキストクラスローダを、自クラスを呼んだNoAnnotationURLClassLoaderに入れ替える。また戻す…謎

*4:initBootLibraries() で、server/default/conf/を見るUnifiedClassLoaderをクラスローダリポジトリMBean経由で生成