`
ww2
  • 浏览: 402128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

OSWorkflow深层讲解系列(一)初始化的原理

阅读更多

<o:p> </o:p>

周日,莫映我们javaparty的伙伴讲了讲osworkflow,估计很多人还是一头雾水。目前国内似乎关注osworkflow的人越来越多,但是却没有多少人去关注其真正值得参考和学习的地方,这是不应该的。OSWorkflow的确非常灵活,但是我们不光需要知道“用的灵活”,还要知道“深层次的东东”。

于是才有了这个系列介绍的打算:

<o:p> </o:p>

在阅读此系列之前,请队FSM又算了解,也请先阅读一下这篇文档:http://blog.csdn.net/james999/archive/2004/10/29/158653.aspx

<o:p> </o:p>

我们现在就先从osworkflow的一个实例如何初始化入手:

<o:p> </o:p>

<v:shapetype o:spt="75" coordsize="21600,21600" stroked="f" id="_x0000_t75" filled="f" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>

<o:p>
 </o:p>

首先OSWorkflow,和我们通常所理解的Engine并不是很一样。在OSWorkflow中没有“Service”的概念,所以每次访问的时候,都可以重新创建一个Workflow对象。我们可以把这个Workflow理解成一个Execute Engine或者Execute Runner。在一个访问请求中,一个Workfow对象负责维护一个流程实例的管理和操作。

<o:p> </o:p>

Workflow workflow = new BasicWorkflow("testuser");<o:p></o:p>
DefaultConfiguration config = new DefaultConfiguration();<o:p></o:p>
workflow.setConfiguration(config);<o:p></o:p>
long workflowId = workflow.initialize("mytest", 1, null);<o:p></o:p>
workflow.doAction(workflowId, 1, null);<o:p></o:p>

<o:p> </o:p>

我们先来说说initialize方法,可以边看文档,边阅读osworkflowAbstractWorkflow类:

       在你的一个工作流定义文件中,至少是需要定义一个initial action。这些initial action其实就是流程实例的可能运行起点。就如同我们通常说说的start node或者start activity等等。

<o:p> </o:p>

<?xml version="1.0" encoding="UTF-8"?><o:p></o:p>

<workflow><o:p></o:p>

  <initial-actions><o:p></o:p>

    ...<o:p></o:p>

  </initial-actions><o:p></o:p>

  <steps><o:p></o:p>

    ...<o:p></o:p>

  </steps><o:p></o:p>

</workflow><o:p></o:p>

<o:p> </o:p>

initialize方法中,主要是存在四个功能:

(1)       创建流程实例对象,在osworkflow中,流程实例对象用WorkflowEntry接口的子类实现

(2)       构造临时变量的集合,即transientVars;用于在一个转移过程中临时保持数据状态

(3)       获取指定的Action对象

(4)       执行这个Action,并造成转移,即transitionWorkflow方法

<o:p> </o:p>

这几个功能中,重中之重,也是OSWorkflow的最为核心的算法,就是最后的转移。在这转移过程中,会执行下面的一系列操作:

<o:p> </o:p>

(这张列表最初是由 莫映 整理,我补充和修改了一些)

(01) Get current step(获取当前的Step<o:p></o:p>

(02) Validate transientVars(验证临时变量)<o:p></o:p>

(03) Validate inputs(验证输入的数据)<o:p></o:p>

    如果step不为null(执行初始化action的时候,current step还不存在)<o:p></o:p>

(04) Execute post-functions(step-level) (执行steppost function<o:p></o:p>

(05) Execute pre-functions(action-level) (执行actionpre function<o:p></o:p>

(06) Check each conditional results (检查每一个条件的执行结果)<o:p></o:p>

(07) Execute pre-functions(result-level) (运行resultpre function<o:p></o:p>

(08) Move current step into history <o:p></o:p>

(09) Create new current step<o:p></o:p>

(10) Execute pre-functions(step-level)<o:p></o:p>

(11) Execute post-functions(result-level)<o:p></o:p>

(12) Execute post-functions(action-level)<o:p></o:p>

    如果是初始化动作<o:p></o:p>

(13) Mark the entry state as Activated <o:p></o:p>

如果是结束动作<o:p></o:p>

(14) Set the entry state Completed <o:p></o:p>

获取globalActions中可以自动执行的,并执行<o:p></o:p>

(15) perform available and auto global actions<o:p></o:p>

<o:p> </o:p><o:p> </o:p>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics