
3.3 Orleans对象的生命管理
为了保证系统运行所依赖的各个模块在Orleans这样复杂的系统中能正常初始化、运转并关闭,Orleans使用了一种通用的对象生命周期管理组件Orleans Lifecycle来管理系统组件在各个阶段的依赖服务注册、初始化、业务处理及服务终止逻辑。
对象在整个生命周期中的状态改变将会触发一个或多个相关组件相应的行为逻辑,这是一种典型的一对多的关系,因此Orleans Lifecycle采用观察者模式设计,Orleans Lifecycle Subject对象负责保存生命周期的状态,各依赖组件将自身相应的运行逻辑作为Observer绑定到Orleans Lifecycle Subject上,由于整个Orleans Lifecycle可以被分为很多阶段(Stage),因此各Observer组件在绑定时需要指定自身逻辑运行所在的阶段编号,当所有Observer组件绑定完毕后,Orleans Lifecycle Subject将按照顺序依次执行在各个阶段上所注册的组件逻辑。
如图3-8所示,整个Orleans Lifecycle Subject分为启动和停止两个阶段,在启动阶段将会依照阶段编号递增顺序依次执行各状态下的组件启动逻辑,而停止阶段则按照阶段编号递减顺序依次执行相应的组件停止逻辑,因此各个需要与Orleans Lifecycle Subject状态关联的组件,都需要实现如下所示的ILifecycleObserver接口。

•图3-8 Orleans Lifecycle Subject组件的执行过程

该接口定义了两个异步方法OnStart和OnStop,分别对应了该组件在启动和停止阶段所执行的方法。实现了ILifecycleObserver接口的对象通过LifecycleSubject对象的Subscribe方法将自身注册至对应的运行阶段中,若有多个对象注册在了同一个运行阶段,LifecycleSubject在该阶段下将会并行执行响应的逻辑,并等待所有对象方法返回后再执行下一阶段任务,LifecycleSubject类的简要代码如下所示。

