Hadoop 0.23 状态机框架
Hadoop 0.23中使用了基于事件驱动机制的异步编程模型。每个对象都是一个有限状态机,有相应的事件处理器(EventHandler),处理器处理对应的事件类型。事件处理后,对象将从一个状态变化到另一个状态。
以Application对象为例,相关类分别为:
状态类:ApplicationState
处理器类:Application
事件类型类:ApplicationEventType
事件类:ApplicationEvent及子类
其状态机如下图:
状态机框架
框架中的泛型
OPERAND
表示状态机的操作对象,如Application对象。
STATE
表示对象的状态,如ApplicationState代表的相关状态。
EVENTTYPE
表示需要处理的事件类型,如ApplicationEventType代表的相关类型。
EVENT
表示具体事件对象,如ApplicationEvent对象。
StateMachine
StateMachine<STATE extends Enum<STATE>,EVENTTYPEextends Enum<EVENTTYPE>, EVENT>
主要方法:
public STATEgetCurrentState();
获取当前状态
public STATEdoTransition(EVENTTYPE eventType, EVENT event)
根据事件类型和事件对象进行状态迁移。
StateMachineFactory
StateMachineFactory <OPERAND,STATE extends Enum<STATE>, EVENTTYPEextends Enum<EVENTTYPE>, EVENT>
状态机框架的实现基本集中在这个类里面。
主要成员
private finalTransitionsListNode transitionsListNode;
所有迁移列表。
private Map<STATE,Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>stateMachineTable;
储存状态机中每个状态和该状态相应迁移的信息。注意,这个table中储存了多个状态机,因为每个状态机的状态都是不相同的。
private STATE defaultInitialState;
创建状态机时默认的初始化状态。
主要方法
public StateMachineFactory<OPERAND, STATE,
EVENTTYPE,EVENT> addTransition(STATE preState, STATE postState,
EVENTTYPE eventType,SingleArcTransition<OPERAND, EVENT>hook)
l public StateMachineFactory<OPERAND, STATE, EVENTTYPE,EVENT> addTransition(STATE preState,Set<STATE> postStates, EVENTTYPE eventType,MultipleArcTransition<OPERAND, EVENT, STATE> hook)
将一个单箭头/多箭头迁移加入StateMachineFactory的迁移列表中。
public StateMachine<STATE, EVENTTYPE, EVENT> make(OPERAND operand, STATE initialState)
创建一个状态机。
相关类
Transition
Transition<OPERAND, STATE extends Enum<STATE>,EVENTTYPEextends Enum<EVENTTYPE>, EVENT>
代表了状态机状态的一次变化。
主要方法:
STATEdoTransition(OPERAND operand, STATE oldState, EVENT event,EVENTTYPE eventType);
根据事件类型和事件将状态机操作对象从旧状态迁移到新状态(返回值)。
迁移的钩子函数接口
迁移的具体处理是由钩子函数完成的。
SingleArcTransition<OPERAND, EVENT>
Hookfor Transition. This lead to state machine to move to the post state asregistered in the state machine.
只有单箭头的迁移,即状态机图中当前状态的后继状态只有一个。
主要方法:
public void transition(OPERAND operand, EVENT event);
MultipleArcTransition
MultipleArcTransition <OPERAND, EVENT,STATE extends Enum<STATE>>
Hookfor Transition. Post state is decided by Transition hook. Post state must beone of the valid post states registered in StateMachine.
多箭头的迁移,状态机图中当前状态的后续状态有多个,由事件类型来决定迁移的后续状态。
主要方法:
public STATE transition(OPERAND operand, EVENT event);
返回值为迁移相应事件的后续状态。
迁移的实现类
SingleInternalArc
单箭头的迁移,迁移的后续状态在创建时指定。
MultipleInternalArc
多箭头的迁移,迁移的可能后续状态在创建时指定,完成迁移后的后续状态由MultipleArcTransition. transition方法给出。
ApplicableTransition
实现类ApplicableSingleOrMultipleTransition,代表一个可以加入stateMachineTable的迁移,创建时需要迁移的前置状态、事件类型和迁移本身。
TransitionsListNode
保存一个ApplicableTransition和下一个TransitionsListNode的指针,可以通过这个类遍历StateMachineFactory中所有的迁移。
InternalStateMachine
实现StateMachine,只保存一个状态机的操作对象和状态机当前的状态。
doTransition方法调用的是StateMachineFactory.doTransition方法,从stateMachineTable中
找到相应迁移,再调用Transition的doTransition。