周日,莫映我们javaparty的伙伴讲了讲osworkflow,估计很多人还是一头雾水。目前国内似乎关注osworkflow的人越来越多,但是却没有多少人去关注其真正值得参考和学习的地方,这是不应该的。OSWorkflow的确非常灵活,但是我们不光需要知道“用的灵活”,还要知道“深层次的东东”。
于是才有了这个系列介绍的打算:
在阅读此系列之前,请队FSM又算了解,也请先阅读一下这篇文档:http://blog.csdn.net/james999/archive/2004/10/29/158653.aspx
我们现在就先从osworkflow的一个实例如何初始化入手:
首先OS的Workflow,和我们通常所理解的Engine并不是很一样。在OSWorkflow中没有“Service”的概念,所以每次访问的时候,都可以重新创建一个Workflow对象。我们可以把这个Workflow理解成一个Execute Engine或者Execute Runner。在一个访问请求中,一个Workfow对象负责维护一个流程实例的管理和操作。
Workflow workflow = new BasicWorkflow("testuser");
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
long workflowId = workflow.initialize("mytest", 1, null);
workflow.doAction(workflowId, 1, null);
我们先来说说initialize方法,可以边看文档,边阅读osworkflow的AbstractWorkflow类:
在你的一个工作流定义文件中,至少是需要定义一个initial action。这些initial action其实就是流程实例的可能运行起点。就如同我们通常说说的start node或者start activity等等。
<?xml version="1.0" encoding="UTF-8"?>
<workflow>
<initial-actions>
...
</initial-actions>
<steps>
...
</steps>
</workflow>
在initialize方法中,主要是存在四个功能:
(1) 创建流程实例对象,在osworkflow中,流程实例对象用WorkflowEntry接口的子类实现
(2) 构造临时变量的集合,即transientVars;用于在一个转移过程中临时保持数据状态
(3) 获取指定的Action对象
(4) 执行这个Action,并造成转移,即transitionWorkflow方法
这几个功能中,重中之重,也是OSWorkflow的最为核心的算法,就是最后的转移。在这转移过程中,会执行下面的一系列操作:
(这张列表最初是由 莫映 整理,我补充和修改了一些)
(01) Get current step(获取当前的Step)
(02) Validate transientVars(验证临时变量)
(03) Validate inputs(验证输入的数据)
如果step不为null(执行初始化action的时候,current step还不存在)
(04) Execute post-functions(step-level) (执行step的post function)
(05) Execute pre-functions(action-level) (执行action的pre function)
(06) Check each conditional results (检查每一个条件的执行结果)
(07) Execute pre-functions(result-level) (运行result的pre function)
(08) Move current step into history
(09) Create new current step
(10) Execute pre-functions(step-level)
(11) Execute post-functions(result-level)
(12) Execute post-functions(action-level)
如果是初始化动作
(13) Mark the entry state as Activated
如果是结束动作
(14) Set the entry state Completed
获取globalActions中可以自动执行的,并执行
(15) perform available and auto global actions