概述
JBoss 7/WildFly 以 domain 模式启动时会启动多个 JVM,例如如下通过启动脚本启动 domain 模式:
./domain.sh
启动后我们查看进程:
[kylin@localhost tdump]$ jps -l
23655 /home/kylin/work/eap/jboss-eap-6.1/jboss-modules.jar
23671 /home/kylin/work/eap/jboss-eap-6.1/jboss-modules.jar
23736 /home/kylin/work/eap/jboss-eap-6.1/jboss-modules.jar
我们可以发现 domain 模式启动时会启动后,有三个进程(对应三个JVM)运行。本文主要研究 domain 模式下是如何启动多个 JVM 的。另外,`jboss-modules.jar` 是 JBoss 底层类加载机制,用于类加载和启动一个 JVM。
从启动脚本开始
domain.sh 脚本中如下信息:
eval \"$JAVA\" -D\"[Process Controller]\" $PROCESS_CONTROLLER_JAVA_OPTS \
\"-Dorg.jboss.boot.log.file=$JBOSS_LOG_DIR/process-controller.log\" \
\"-Dlogging.configuration=file:$JBOSS_CONFIG_DIR/logging.properties\" \
-jar \"$JBOSS_HOME/jboss-modules.jar\" \
-mp \"${JBOSS_MODULEPATH}\" \
org.jboss.as.process-controller \
-jboss-home \"$JBOSS_HOME\" \
-jvm \"$JAVA_FROM_JVM\" \
-mp \"${JBOSS_MODULEPATH}\" \
-- \
\"-Dorg.jboss.boot.log.file=$JBOSS_LOG_DIR/host-controller.log\" \
\"-Dlogging.configuration=file:$JBOSS_CONFIG_DIR/logging.properties\" \
$HOST_CONTROLLER_JAVA_OPTS \
-- \
-default-jvm \"$JAVA_FROM_JVM\" \
'"$@"'
JBOSS_STATUS=$?
基于 JBoss Module 类加载机制,我们查看 org.jboss.as.process-controller,在 `module.xml` 的描述中启动 Main 方法如下:
<module xmlns="urn:jboss:module:1.1" name="org.jboss.as.process-controller">
<properties>
<property name="jboss.api" value="private"/>
</properties>
<main-class name="org.jboss.as.process.Main"/>
所以我们可以从 `org.jboss.as.process.Main` 类开始,JBoss 是完全开源的,这样很容易开始调试代码,通过如下步骤可以开始调试启动代码:
- 在 pom.xml 中添加如下依赖
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-process-controller</artifactId>
<version>7.2.0.Final-redhat-8</version>
</dependency>
- 编辑 domain.conf,添加如下配置
PROCESS_CONTROLLER_JAVA_OPTS="$PROCESS_CONTROLLER_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,a