【PE】流程图对象以及事件驱动机制的介绍
本文是PE系统的第一个开发者文档,首先对PE本身做个简单介绍吧!PE是一个面向开发者的基于WF的流程引擎,她还很“小”,功能有限,请大家原谅。目前PE的版本是0.1版,所以请大家不要试图在商业项目中使用,由此造成的后果本人概不复杂。^_^当前版本下PE能完成的主要任务是:构造流程并使流程运行起来。虽然有部分功能实际可以发布,但我还是想等PE稳定一点再公布出来。PE的简单之处再次请大家原谅。从这篇随笔开始,我会陆续介绍PE中支持的流程元素并给出相应的Demo代码,有不正确和无知之处也请原谅,并欢迎指出。PE目前的基本流程元素以及属性主要参考了Business Process Model Notation(BPMN),对这个标准有兴趣的,可以到www.bpmn.org/下载文档。
(一)流程图
既然我们的首要目的使创建流程,那么我们就需要一个容器来容纳流程,这就是流程图(Process Diagram)。在PE中,每个流程图都可以容纳一个或多个流程。在WF中没有流程图,我自己构造了流程图对象:
ProcessDiagram processDiagram = new ProcessDiagram() { Name = "FirstDiagram" };
你可以通过上述代码来创建。
在PE中我还加入了泳道的概念,流程不是直接放置在流程图中,而是放置在流程池(Pool)中,它们的关系如下:
每个流程可以包含一个或多个流程池,每个流程池仅可以包含一个流程。
processDiagram.AddPool(new Pool("FirstPool"));
通过上述代码你可以创建一个名字为FirstPool的流程池,并把它加入到流程图中,你可以加入多个流程池。
注:在PE中同一个流程图中的所有流程对象的名称不能重复,否则重名的对象会被忽略。
当AddPool方法中,不仅仅会把流程池对象加入到流程图中,还会自动创建一个流程(BusinessProcessActivity)对象,它的名字和Pool的名字相同,并与当前流程池关联。
你可以通过流程图中的GetBusinessProcessByPoolName(string poolName)方法来得到自动创建的流程对象并修改其名字。
上图是流程图对象的结构,其中大部分方法都提供了图中元素的增、删、查功能,都用到时我具体再介绍。
(二)事件驱动
当建立了流程图和流程后,流程的启动是最为关键的事情。在PE中,流程的启动,继续执行以及结束都使用事件的形式来驱动。根据事件被触发的时机不同,分为开始事件(StartEvent),结束事件(EndEvent)和中间事件(IntermediateEvents)。
开始事件用于启动流程的事件;结束事件是当流程结束时执行的动作;而中间事件有两大作用:一是继续流程的执行,二是处理错误或事务取消补偿执行。开始事件根据触发流程启动的原因不同分为:NoneStartEvent、LinkStartEvent、MessageStartEvent、TimerStartEvent以及MultipleStartEvent。
a、NoneStartEvent表明流程是由人工的方式来触发的,这里的人工是指流程引擎以外的程序,比如:引擎的使用代码。
b、LinkStartEvent表明流程是由另外一个流程的LinkEndEvent事件触发启动的;
c、MessageStartEvent表明流程是由其他流程发送消息(Message)触发启动的;
d、TimerStartEvent表明流程由时间因素触发启动;
e、MultipleStartEvent表明流程可以多个原因中的某个触发启动,即MultipleStartEvent可以包含多个上述开始事件中的多个,其中一个被触发,则MultipleStartEvent就被触发。
processDiagram.GetBusinessProcessByPoolName("FirstPool").AddActivity(new NoneStartEvent() { Name = "NoneStartEvent" });
上述代码在名为"FirstPool"的流程中加入了一个NoneStartEvent。
结束事件根据流程结束时执行的任务不同分为:NoneEndEvent、TerminateEndEvent、CancelEndEvent、CompensationEndEvent、ErrorEndEvent、LinkEndEvent、MessageEndEvent、MultipleEndEvent。
a、NoneEndEvent表明流程结束时不执行任何代码,正常结束。
b、TerminateEndEvent表明流程需要在此终止一切活动。
c、CancelEndEvent表明流程相关事务将执行取消操作,如果流程中设置了取消中间事件,则会引发取消处理活动的执行。
d、CompensationEndEvent表明流程结束时需要执行额外的补偿任务,如果流程中设置了补偿中间事件,则会引发补偿活动的执行。
e、ErrorEndEvent表明流程以发生错误结束,如果流程中设置了错误中间事件,则会引发错误处理活动的执行。
f、LinkEndEvent表明流程结束时会引发另一流程的开始。
g、MessageEndEvent表明流程结束时会发送一条消息给其他流程。
h、MultipleEndEvent表明流程结束时执行多个上述结束事件,即在MultipleEndEvent可以加入多个上述结束事件,并同时执行。
processDiagram.GetBusinessProcessByPoolName("FirstPool").AddActivity(new NoneEndEvent() { Name = "NoneStartEvent" });
上述代码在名为"FirstPool"的流程中加入了一个NoneEndEvent。
中间事件我会在之后的随笔中再作说明,有关开始事件和结束事件的Demo会在这几天的随笔中发布下载。
欢迎大家指教。