BPMN中的任务(task)介绍
关键词: BPMN, task, 任务, Service Task, Send Task, Receive Task
研究BPMN相关的东西很久,对其中的TASK的了解始终缺乏一个完整的认识和整理,今天,根据经验通过提取BPMN规范中的要点来形成本文,来对BPMN中TASK进行一个初步的阐述。
1.任务(Task)
任务(Task)是一个流程(Process)中的关键原子级的活动。Task,是用来指代一个由人或计算设备来完成的活动,这些活动通过流程组合在一起而发挥效用。
图1 Task
如上图所示,在BPMN中一个Task使用一个单实线圆角矩形来表示。在Task上可以设置一个Marker(记号),Marker的指代作用可以在后面具体讲解中理解。Marker有三种类型:1)Loop Marker 2) Multiple Instance Marker 3) Compensation Marker, 如下图所示
图2 三种Marker
1.1 Loop Marker
也被称为Standard Loop Marker,如果指定了该Marker,该任务就会通过使用一个布尔表达式来做出是否再次执行本任务的决定,布尔表达式的检测分为执行任务前和任务后检测,任务前检查相当于while循环,任务后检查相当于until循环。
1.2 Multiple Instance Marker
也被称为MultipleInstance Loop Marker,这个Marker对应着一种编程结构for each,但是多实例Marker使得一个Task将成为多实例任务,多实例任务是最复杂的。
首先一个多实例任务,会有一个表达式,表达式的返回值是一个整数,这个整数标识当前任务还可再生成的实例数目,每个实例都可以用来去完成一个任务。
一个多实例任务,分为两种类型,Sequential和Parallel。Sequential任务类似于Standard Loop类型的Task,所有的待执行实例,会一个接一个地去执行。
而Parallel则将所有的待执行实例,并排展开,同时执行,而通过判断条件来进行实例调用,而实例的调用结果和当前Task是否标记为完成还有着复杂的关系,关于多实例任务,还是应该有一个专门的文章来介绍。
图3 不用MuiltipleInstance Task时一个例子
1.3 Compensation Marker
compenstation marker标志一个compensation task,通常使用在发生异常的状况下,如下图这个例子,当向买者收费发生异常时,就需要调用一个补偿任务,将用户打来的款再支付给用户。
图4 compensation task的例子
2. Service Task
顾名思义, Service Task是通过服务(可以是Web服务,也可以是自动化程序)来完成的任务。Service Task有三个重要的属性:
- InMessage - 只有一个输入消息,虽然可以有多个输入的消息流,但是对于Service Task的每一个实例,都只能有一个消息流(Message Flow)能够设置当前的输入消息,另外有一点要注意,就是一个Service Task要能够接收消息,必须先定义相应的InputSet【注:这里的InputSet规则尚不详尽,会在以后进行更正】。
- OutMessage - 只有一个输出消息,当有多个输出流(Message Flow)时,在当前Task实例完成时,会向所有的输出流发送消息。
- Implementation - 表示实现当前这个服务的实现技术,默认为Web Service,即通常为使用Web Service来完成输入消息的接收,并负责返回输出消息。
- 总结:输入多选一,输出全包揽。
图5
3. Receive Task
Receive Task是用来等待外部Participant消息的任务,一旦接收到外部消息该任务就标记为完成状态,很多时候,一个流程都会以一个Receive Task作为开始,通过接收一条外部消息来启动流程,它可以看做是一种特殊的Service Task,它只允许接收消息,而不允许发送消息,Receive Task有两条重要属性:
- InMessage - 在规范中为Message,用来指代输入消息,当有多个输入流时,只要有一流到达,当前实例任务即完成。
- Implementation - 同Service Task,指定接收的当前消息的实现体,如一个Web Service。
4. Send Task
Send Task是一个用来向外部Participant发送消息的任务,一旦消息发送出去,该任务就完成了。同Receive Task类似,该任务,只能发送消息,并有一个实现体,如Web Service来负责发送该消息。
5. 其他Task
除了上面三个重要的Task类型,在BPMN中还有:
- User Task - 需要人在计算机的帮助下完成的任务,但UserTask的属性都与Web Service相同,两者的区别在于此处的UserTask并不意图直接由Web Serivce等来执行,而是类似文档性地指出人是在什么的帮助下完成任务的,如果使用引擎执行这里,这里还有尚待解决的新问题。
- Script Task - 通过引擎可识别的脚本语言来进行自动化操作。
- Manual Task - 纯人工任务,没有计算机的参与。
- Reference Task - 相当于其他Task的引用。
参考文献
[1] BPMN specification 1.1. http://www.bpmn.org/
[2] How use tasks in BPMN. http://tynerblain.com/blog/2006/08/01/bpmn-tasks/