(本文源代码版本为JBoss-AS-Final 6.1.0)
JBoss 的服务状态定义在 LifecycleState 类中。
一共有八个状态:INSTANCIATED, PRE_INIT, INITIALIZED, IDLE, STARTING, STARTED, STOPPING, STOPPED
下面分别解释:
一、INSTANCIATED
一个服务最原始的状态,只有一次。进入其他状态后,再也不会回到这个状态。
这个状态是在 AbstractServer的构造方法的最后一行被设置的。
this.state = LifecycleState.INSTANCIATED;
在构造方法之后,执行的是initialize()方法,因此,这个状态下,服务还没有初始化。
在很多JBoss的错误中,经常看到这个状态。
这个词的字面意思很容易让人理解为:实例化的,其实他的意思是:你的服务还在 最原始 的状态,没有被启动!
二、PRE_INIT
初始化之前的准备状态: pre-initialize,在AbstractServer执行 initialize()方法时,设置状态为 PRE_INIT。这种状态只有一次。
这个状态设置完后,开始调用doInitialize()方法。
在 INSTANCIATED ------> PRE_INIT 之间,完成了 configuration是否为空的判断,此时的configuration是一个刚刚实例化的 BasicJBossASServerConfig 对象。
与 INSTANCIATED 不同的是,设置PRE_INIT状态使用了
this.setState(LifecycleState.PRE_INIT);
this.state = state; final Set<LifecycleEventHandler> handlers = this.getHandlersForEvent(state); for (final LifecycleEventHandler handler : handlers) { handler.handleEvent(state); }
final LifecycleEventHandler startHandler = new KernelStartEventLifecycleEventHandler(this); final LifecycleEventHandler stopHandler = new KernelStopEventLifecycleEventHandler(this); this.registerEventHandler(startHandler, LifecycleState.STARTED); this.registerEventHandler(stopHandler, LifecycleState.STOPPING);
三、INITIALIZED
初始化完成,AbstractServer及其子类的doInitialize()方法全部执行完毕,回到initialize()后将 PRE_INIT 状态变为 INITIALIZED。这种状态只有一次。
也是使用
this.setState(LifecycleState.INITIALIZED);
四、IDLE
空闲状态,表示还没有启动或者正在等待启动。最初这个状态是紧跟着INITIALIZED状态设置的:
this.setState(LifecycleState.INITIALIZED); this.setState(LifecycleState.IDLE);
this.setState(LifecycleState.STOPPED); this.setState(LifecycleState.IDLE);
五、STARTING
正在启动过程中,还没有启动完毕。
在 AbstractServer的 StartServerTask 中设置了STARTING状态:
setState(LifecycleState.STARTING);
六、STARTED
启动完成,处于服务的状态。
这个状态是在 AbstractServer的 StartServerTask完成了 doStart()等方法之后,在最后设置的。
同时,也触发了 KernelStartEventLifecycleEventHandler 事件处理!
这是一个并行的处理机制。
STARTED可以转换为 STOPPING。
七、STOPPING
正在停止,还没有完成。
同时,也触发了 KernelStopEventLifecycleEventHandler 事件处理!
这个状态会转换到 STOPPED。
八、STOPPED
停止完毕。然后转换到IDLE状态。
以上状态只有 INSTANCIATED ,IDLE ,STARTED和 STOPPED状态是稳定的,我们经常看到的只有这个4个稳定的状态。
其他状态在程序执行过程中会转变为稳定状态,因此这些不稳定状态我们是无法获取到的。