启动和停止

Exisi 2022-06-28 07:39:56
Categories: Tags:
  • 除了初始化和销毁回调之外,Spring 托管的对象还可以实现 Lifecycle 接口,以便这些对象可以在容器自身生命周期的驱动下参与启动和关闭过程。

 

 

  • Lifecycle 接口定义了任何具有自身生命周期需求的对象的基本方法 (例如,启动和停止一些后台过程)

方法

说明

start()

启动当前组件

如果组件已经在运行,不抛出异常,这会将 开始信号 传播到应用的所有组件中去

stop()

停止当前组件

通常以同步方式停止该组件,当该方法执行完成后,该组件会被完全停止。当需要异步停止行为时,考虑实现SmartLifecycle 和它的 stop(Runnable) 方法变体。

此停止通知在销毁前不能保证到达,在常规关闭时,bean将首先收到一个停止通知,然后才传播常规销毁回。调然而,在上下文的生命周期内的热刷新或中止的刷新尝试上,只调用销毁方法对于容器,这将把停止信号传播到应用的所有组件

isRunning()

检查此组件是否正在运行

只有该方法返回false时,start方法才会被执行

只有该方法返回true时,stop(Runnable callback)stop()方法才会被执行

 

  • LifeCycle 定义 Spring 容器对象的生命周期,任何 spring 管理对象都可以实现该接口。

 

  • ApplicationContext 本身接收启动和停止信号 (例如在运行时停止 / 重启场景) 时,Spring 容器将在容器上下文中找出所有实现了 LifeCycle 及其子类接口的类,并调用它们实现的类。它将把这些调用级联到在该上下文中定义的所有 Lifecycle 实现,然后通过委托 LifecycleProcessor 来完成此任务

 

  • LifecycleProcessor 本身是 Lifecycle 接口的扩展。它还添加了两种其他方法来响应正在刷新和关闭的上下文:

方法

说明

onRefresh()

响应正在刷新Spring容器上下文

onClose()

响应关闭的上下文

不能保证会在销毁之前发出停止通知。在常规关闭时,在传播常规销毁回调之前,所有 Lifecycle bean 都首先收到停止通知。但是,在上下文生存期内的热刷新或中止的刷新尝试中,仅调用 destroy 方法

 

 

 

自动的生命周期扩展(SmartLifecycle

  • Lifecycle 接口是用于显式启动和停止通知的普通协议,并不意味着在上下文刷新时自动启动。为了对特定 bean 的自动启动进行精细控制 (包括启动阶段),可以实现 SmartLifecycle

 

  • SmartLifecycle 同时继承了 Lifecycle Phased,同时实现了以下方法:

方法

说明

isAutoStartup()

如果该`Lifecycle`类所在的上下文在调用`refresh`,希望能够自己自动进行回调,则返回true,组件打算通过显式的start()调用来启动返回false的值,类似于普通的Lifecycle实现

stop(Runnable callback)

指示如果生命周期组件当前正在运行,则必须停止该组件。

 

提供的回调由{@link LifecycleProcessor}使用,以支持具有公共关闭顺序值的所有组件的有序且可能并发的关闭。

 

SmartLifecycle组件确实停止后,必须执行回调。

 LifecycleProcessor 将只调用这个 stop 方法的变体;即SmartLifecycle实现不会调用 Lifecycle.stop(),除非在该方法的实现中明确委托。

 

  • 容器中实现了 Lifecycle 的多个类如果希望有顺序的进行回调时,那么启动和关闭调用的顺序可能很重要。如果任何两个对象之间存在依赖关系,那么依赖方将在依赖后开始,在依赖前停止。然而,有时直接依赖关系是未知的。可能只知道某个类型的对象应该在另一个类型的对象之前开始。在这些情况下,SmartLifecycle 接口定义了另一个选项,即在其继承自 Phased getPhase() 方法

 

方法

说明

getPhase()

用于获取组件的执行阶段。

方法返回一个整数值,表示组件的执行顺序。具有较小值的组件将先被执行,而具有较大值的组件将后被执行。如果两个组件具有相同的阶段值,则它们将按照它们在应用程序上下文中注册的顺序进行排序

 

  • 当开始时,getPhase() 返回值最小的对象先开始,当停止时,遵循相反的顺序。因此,实现 SmartLifecycle 的对象及其 getPhase() 方法返回 Integer.MIN_VALUE 将在第一个开始和最后一个停止。相反,MAX_VALUE 将指示对象应该在最后启动并首先停止 (可能是因为它依赖于要运行的其他进程)SmartLifecycle 对象的默认 phase 0。因此,任何实现类的 phase 的值为负数时都表明一个对象应该在这些标准的生命周期回调之前进行执行,反之亦然

 

  • SmartLifecycle 定义的 stop 方法接受一个回调。在实现的关闭过程完成之后,任何实现都必须调用回调的 run() 方法。这允许在必要时进行异步关闭,因为 LifecycleProcessor 接口,即 DefaultLifecycleProcessor,的默认实现,将等待每个阶段中的对象组的超时值来调用这个回调。默认的每个阶段超时为 30秒。您可以通过在上下文中定义一个名为 lifecycleProcessor bean 来覆盖默认的生命周期处理器实例

示例

<bean id="lifecycleProcessor"

class="org.springframework.context.support.DefaultLifecycleProcessor">

 

<!-- timeout value in milliseconds -->

<property name="timeoutPerShutdownPhase" value="10000"/>

 

</bean>

 

  • LifecycleProcessor 接口也定义了用于刷新和关闭上下文的回调方法。后者将简单地驱动关机过程,就好像已经显式地调用了 stop() 一样,但它将在上下文关闭时发生。

 

  • 另一方面,refresh 回调支持 SmartLifecycle bean 的另一个特性。当刷新上下文 (在所有对象实例化和初始化之后) 时,将调用这个回调,此时,默认的生命周期处理器将检查每个 SmartLifecycle 对象的 isAutoStartup() 方法返回的布尔值。如果是 true,那么该对象将在此时启动,而不是等待上下文或其自己的 start() 方法的显式调用 (与上下文刷新不同,上下文启动不会自动发生在标准上下文实现中)。“阶段” 值以及任何 “依赖” 关系将以如上所述的方式确定启动顺序