好文档 - 专业文书写作范文服务资料分享网站

深入浅出 jBPM 电子书

天下 分享 时间: 加入收藏 我要投稿 点赞

第9章 流程建模

9.1 综述

流程定义(process definition)基于有向图表示了一个业务流程的规格化描述。图是由节点(node)和转换(transition)组成的,图中每个节点都有一个特定类型,节点的类型定义了运行时的行为。一个流程定义只能有一个开始状态。

令牌(token)是一个执行路线。令牌是运行时概念,它维护了一个指向图中节点的指针。 流程实例是(process instance)流程定义的执行。当一个流程实例创建后,一个令牌也为执行的主要路线创建了,这个令牌被称为流程实例的根令牌(root token),它被定位于流程定义的开始状态。

信号(signal)指示令牌继续图的执行。当令牌接收到一个没有命名的信号,它会经由缺省的离开转换离开它的当前节点;当一个转换名称在信号中被指定时,令牌会经由指定的转换离开节点。发送到流程实例的信号被委托给根令牌。

令牌进入节点后,节点被执行。节点自己有责任让图继续执行,图的继续执行是通过让令牌离开节点完成的。每个节点类型为了图的继续执行可以实现不同的行为,如果一个节点不能传播图的执行,则被表现为一个状态。

动作(Action)是在流程执行中的事件上被执行的java代码片断。在软件需求中,图是信息交流的一个重要手段,但是图只是将要生产的软件的一个视图(影像),它隐藏了很多技术细节。动作是在图的表示之外添加技术细节的一种机制,一旦图被做好,它可以由动作来修饰。主要的事件类型有:进入节点、离开节点、执行转换。

9.2 流程图

基本的流程定义是一个由节点和转换组成的图,这些信息在processdefinition.xml中表示。每个节点都有一个类型,如state、decision、fork、join等;每个节点有一组离开转换,可以给离开节点的每个转换一个名称来区分它们。例如:下图显示了jBay拍卖流程的流程图。

图 9.1拍卖流程图

下面是jBay拍卖流程图的xml表示:

9.3 节点

流程图是由节点和转换组成的,有关图的以及它的扩展模型的更多信息,请参考“第4章 面向图的编程”TODO。

每个节点有一个特定类型,节点类型决定了在运行时执行到达节点时将发生什么。Jbpm有一组你可以使用的预定义的节点类型,另外,你也可以编写定制代码来实现你自己指定的节点行为。

9.3.1 节点责任

每个节点都有两个主要责任:首先,它可以执行普通java代码,典型情况下,java代码与节点功能是相关的,例如:创建一些任务实例、发送一个通知、更新一个数据库等;其次节点要负责传播流程执行。基本上来说,每个节点在传播流程执行时有以下几个可选方式:

1.不传播执行。这种情况下节点表现为一个等待状态。

2.经由节点的某个离开转换传播执行。这意味着到达本节点的令牌使用API调用executionContext.leaveNode()经由某个离开转换被传递,这时节点作为一个自动节点,它可以执行一些定制的程序逻辑然后自动继续流程执行,而没有等待。

3.创建一个新的执行路径。节点可以决定创建新的令牌,每个新的令牌表示一个新的执行路径,并且每个令牌可以通过节点的离开转换被启动。这种行为的一个很关好的例子就是fork节点。

4.结束执行路径。节点可以决定结束执行路径,这意味着令牌被结束,执行路径也就完结了。

5.更一般的情况,节点可以修改流程实例的整个运行时结构。运行时结构是包含一个令牌树的流程实例,每个令牌表示一个执行路径,节点可以创建和结束令牌,把每个令牌放在图中的节点,并且通过转换启动令牌。

Jbpm像其他任何工作流和BPM引擎一样,包含一组预实现的节点类型,它们有特定的文档配置和行为,但是关于Jbpm和面向图的编程基础(第4章 面向图的编程TODO)相对于其他来说其独特之处是对开发者开放模型,开发者可以很容易的编写自己的节点行为,并在流程中使用。

这也就是传统的工作流和BPM系统非常封闭之处,它们通常提供一组固定的节点类型(叫做流程语言),它们的流程语言是封闭的并且执行模型被隐藏在运行环境中。研究工作流模式可以发现,任何流程语言都不足够强大,我们决定做一个简单模型,并且允许开发者编写他们自己的节点类型,而JPDL流程语言则是完全开放的。

接下来我们论述JPDL中非常重要的节点类型。

9.3.2 节点类型task-node

任务节点代表一个或多个被人所执行的任务。因此当执行到达一个任务节点时,任务实例将会在工作流参与者的任务列表中被创建,然后,节点将表现为一个等待状态,当用户执行了他们的任务时,任务的完成会触发恢复执行,换句话说,这将导致一个新的信号在令牌上被调用。

9.3.3 节点类型state(状态)

状态就是一个等待状态,与任务节点不同的是没有任务实例在任务列表中被创建,如果流程需要等待一个外部系统,这是有用的。例如,在节点的入口处(通过node-enter时间的动作),可以发送一个消息到外部系统,然后流程进入等待状态,当外部系统发送一个响应消息时,这可以导致一个token.signal(),用来触发恢复流程执行。

9.3.4 节点类型decision(决策)

实际上有两种方式来建模决策,这两种方式之间的不同是基于“谁”来做决策,可以由流程(请阅读:在流程定义中指定)来做决策,或者由外部实体来提供决策结果。

当由流程来做决策时,就应该使用决策节点了。有两个基本的方法来指定决策标准:简单的方式是在转换上添加条件元素(condition),条件是返回一个布尔值的beanshell脚本表达式,在运行时,决策节点会循环它的离开转换(按照xml中指定的顺序)并计算每个条件,第一个条件结果返回为“true”的转换将被使用。另外一种可选方式是指定一个DecisionHandler的实现,然后决策在java类中被计算并且通过DecisionHandler实现的decide方法返回所选的离开转换。

当决策是由外部部分(意思是:不是流程定义的一部分)来决定时,你可以使用多个转换离开一个状态或等待状态节点,然后,离开转换可以被提供到外部,在等待状态结束后触发恢复执行,例如Token.signal(String transitionName)和TaskInstance.end(String transitionName)。

9.3.5 节点类型fork(分支)

分支把一个执行路径分裂成多个并发的执行路径。默认的分支行为是为每个离开分支的转换创建一个子令牌,并且与到达分支的令牌之间创建一个父子关系。

9.3.6 节点类型join(联合)

默认的联合假定到达联合的所有令牌都是同一父令牌的子令牌,这种情形当使用上面所提到的分支节点、并且当所有由分支创建的令牌到达同一联合时发生。联合会结束进入联合的每个令牌,然后联合会检查进入联合的令牌的父子关系,当所有的兄弟令牌都到达联合时,父令牌将会通过离开转换传播,当仍然还有活动的兄弟令牌时,联合表现为一个等待状态。

9.3.7 节点类型node

node节点类型适用于当你想要在节点中编写自己的代码的情形。node类型节点需要一个子元素动作(action),当执行到达节点时动作被执行,你写在actionhandler中的代码可以做任何事情,也包括节点必须自己负责传播执行(参考9.3.1 节点责任)TODO。

如果你想要使用JavaAPI实现一些对业务分析者来说非常重要的功能逻辑,则可以使用node类型节点,通过使用node节点,节点在流程的图形表示中是可见的。作为对比,如果逻辑对于业务分析者来说是不重要的,则动作(下面将会介绍)允许你在流程的图形表示中添加不可见的代码。

9.4 转换(Transitions)

转换有一个源节点和一个目标节点,源节点用from属性表示,目标节点用to属性表示。 节点可以有一个任意的名称,注意:很多Jbpm特性依赖于唯一的转换名称,如果有多个转换有相同的名字,则拥有给定名称的第一个转换被使用。如果在一个节点中存在重复的转换名称,则Map getLeavingTransitionsMap()方法返回的元素将少于List getLeavingTransitions()方法。

默认的转换是列表中的第一个转换。

9.5 动作(Actions)

动作是在流程执行的事件上被执行的java代码片断。在软件需求交流中图是一种重要的工具,但是图仅仅是要生产的软件的一个视图(影射),它隐藏了很多技术细节,动作是一种在图形表示之外添加技术细节的机制。一旦图被做好,它就可以用动作来进行装饰,这意味着在不改变图的结构的情况下,java代码可以与图关联。主要的事件类型是进入节点、离开节点、执行转换。

注意动作被放置在事件与被放置在节点之间的差异。放置在事件中的动作当事件激活时被执行,事件上的动作不能影响流程的控制流,这很像观察者模式。另一方面,放置在node(参考9.3.7 节点类型node )TODO上的动作则有传播流程执行的职责(参考9.3.1 节点责任)TODO。

让我们来看一个事件动作的例子。假设我们要在给点转换上做数据库更新,数据库更新是技术上必须的,但是对于业务分析者来说它是不重要的。

图 9.2 数据库更新动作

public class RemoveEmployeeUpdate implements ActionHandler { public void execute(ExecutionContext ctx) throws Exception { // get the fired employee from the process variables.

深入浅出 jBPM 电子书

第9章流程建模9.1综述流程定义(processdefinition)基于有向图表示了一个业务流程的规格化描述。图是由节点(node)和转换(transition)组成的,图中每个节点都有一个特定类型,节点的类型定义了运行时的行为。一个流程定义只能有一个开始状态。令牌(token)是一个执行路线。令牌是运行时概念,它维护了一个指向图中节点
推荐度:
点击下载文档文档为doc格式
8l9bb1yjqg01k8300sny
领取福利

微信扫码领取福利

微信扫码分享