调试 WildFly Standalone 启动过程

本文内容包括:

  • jboss-modules.jar 启动 org.jboss.as.server.Main
  • JBoss MSC 启动 Services
  • Controller Boot Thread

jboss-modules.jar 启动 org.jboss.as.server.Main

当完成 WildFly 安装,我们会发现在根目录下有一个 jboss-modules.jar,该 jar 负责加载 WildFly 启动所需相关的 jar 包,以及启动 WildFly,我们到根目录下运行:

java -jar jboss-modules.jar -version

会输出相应 JBoss Modules 版本信息,如果以如下方式运行

java -jar jboss-modules.jar -mp modules org.jboss.as.standalone

jboss-modules.jar 会在 modules 目录下找到 org.jboss.as.standalone Module,运行该 Module 定义的 Main 方法。如下为 WildFly 启动脚本 standalone.sh 的部分内容,

         -jar \"$JBOSS_HOME/jboss-modules.jar\" \
         -mp \"${JBOSS_MODULEPATH}\" \
         org.jboss.as.standalone \

在 WildFly 根目录下查看 org.jboss.as.standalone Module 的配置文件 modules/system/layers/base/org/jboss/as/standalone/main/module.xml, 我们可以发现 jboss-modules.jar 启动的 Main 方法为 org.jboss.as.server.Main

<module xmlns="urn:jboss:module:1.3" name="org.jboss.as.standalone">
    <main-class name="org.jboss.as.server.Main"/>

通过如下三步调试 jboss modules

Steps.1 编辑 standalone.conf,添加如下 JVM 调试参数

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y"

Steps.2 添加 jboss-modules.jar 到当前 classpath

Steps.3 在 org.jboss.modules.Main 类 main() 方法中添加断点后,启动 JBoss,开始调试,如下图

standalone startup modules main

JBoss MSC 启动 Services

运行 org.jboss.as.server.Main 会启动 WildFly 内核 JBoss MSC,随后 JBoss MSC 启动一系列 Services,如

  • ApplicationServerService - the root service for an Application Server process
  • ServerService - Service for the Controls reads of and modifications to a management model for an AS server instance.

通过如下三步调式 JBoss MSC

Steps.1 添加系统变量控制 MSC 线程数

MSC 是一个容器,它可启动工作线程,这些工作线程用来启动 WildFly 服务,我们可以通过如下系统变量控制 MSC 线程数:

-Dorg.jboss.server.bootstrap.maxThreads=1

如上,MSC 启动后共有一个工作线程。

org.jboss.server.bootstrap.maxThreads 参数在调式过程中非常有用,WildFly 默认 JBoss MSC 的线程数为物理processor数(cores * 2)

Steps.2 添加相关 jar 包

Maven 项目中添加如下依赖:

            <dependency>
                <groupId>org.wildfly</groupId>
                <artifactId>wildfly-controller</artifactId>
            </dependency>
            <dependency>
                <groupId>org.wildfly</groupId>
                <artifactId>wildfly-server</artifactId>
            </dependency>

Steps.3org.jboss.as.server.Main 中添加调试断点开始调试如下:

standalone startup main

Controller Boot Thread

ServerService 启动了 Controller Boot Thread,该线程负责启动一系列 Services 包括:

  • jboss.deployment.extension-index(org.jboss.as.server.moduleservice.ExtensionIndexService)
  • jboss.server.suspend-controller(org.jboss.as.server.suspend.SuspendController)
  • jboss.server.graceful-shutdown-service(org.jboss.as.server.GracefulShutdownService)
  • jboss.http.listener.registry(org.jboss.as.remoting.HttpListenerRegistryService)

  • Model Defined Services

在 Controller Boot Thread 完成启动所有 Services 后会日志输出启动了多少个 Service,以及多少个是 lazy 的,如下为一示例:

16:19:33,431 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.2.0.Final "Tweek" started in 4334ms - Started 313 of 374 services (102 services are lazy, passive or on-demand)

如上为默认 WildFly 启动的所有 services 的个数为 374,其中大多数 services 是 Model Defined Services(配置文件中定义的,JEE 相关的 services)。

调式Controller Boot Thread

我们可以在 org.jboss.as.controller.AbstractControllerService start 方法中添加断点,调式 Controller Boot Thread 的启动和运行:

standalone startup controller boot

总结

如下图所示

standalone startup process

WildFly 启动过程是启动了一系列 Services,这些 Services 通过 JBoss MSC 管理.