jBPM开发:流程图的组成元素
二月 21, 2009 in Java开源
上一篇文章中我们实现了一个简单的审批流程,但是对于流程中涉及的元素没有做任何的解释,本文主要针对的流程的主要组成元素进行描述。
内容根据 jBPM的用户手册进行描述,主要描述一下后面将要实现的一个实际例子中所涉及的元素。
一,基本概念和名次解释
流程定义(Process Definition)是基于定向图表示的一个业务流程的声明,由节点和转换组成,图中的每个节点都有一个特定的类型,节点类型定义了运行时的行为,流程定义有且只有一个开始状态。
令牌(Token)是执行的一个路线,令牌是运行的时间概念,用来维护图中指向节点的指针。
流程实例(Process Instance)是一个流程定义执行的实例,当一个流程实例被建立后,一个令牌也为主要执行路线建立了,这个令牌称为这个流程实例的根令牌,它的位置处于流程定义的开始状态。
一个信号(Signal)指示令牌继续流程图的执行,当接受到无名的信号时,令牌将用缺省的离开转换离开节点,当转换名字在信号中明确指定,令牌将使用指定的转换离开节点。
在令牌进入节点后,节点被执行,节点负责继续图的执行。图执行的连续是通过让令牌离开节点来完成的,每个节点类型为了连续图执行实现了不同的行为,一个节点如果不能传播执行将被认为是一个状态。
动作(Action)是在流程执行中在事件上执行的一段Java代码。动作是一种在图形表示之外增加更多技术细节的机制,一旦图放在某个地方,它可以使用动作来修饰。
二,节点的职责
流程图由节点(Node)和转换(Transition)组成。每个接点有一个指定的类型,节点类型定义了当执行到达这个节点的时候将发生什么,jBPM 预定义了一套节点类型,开发人员可以编写自己的代码实现节点的行为。
节点有2个主要责任:
首先是执行Java代码,Java代码和节点的功能相关,如建立一个新的任务实例、发送一个通知、更新数据库等等;
其次,节点负责传播流程的执行,节点有下列可选的传播流程执行的选项:
- 不传播执行。节点的行为是作为一个等待的状态
- 执行节点的离开转换来传播执行。令牌到达节点后通过一个调用 executionContext.leaveNode(String)方法来达到离开转换,节点可执行一些客户化的程序逻辑,然后自动继续执行流程,不会等待。
- 建立新的执行路线。节点可以决定建立新的令牌。每个新令牌表示一个新的执行路线,并且每个新令牌可以通过节点的离开转换被调用。一个很好的例子就是fork(分支)节点模式的行为。
- 结束执行路线。节点可以决定结束执行路线,令牌一旦结束表明执行路线执行完成。
三,常用的节点类型
基于实用的原则,本节只介绍一些常用的节点类型,并没有覆盖全部的类型。
- 任务节点(Task Node):
任务型接点代表一个或多个可以被人执行的任务。当执行到达一个任务节点,任务实例将在工作流参与者任务清单中被建立,之后节点将被作为一个等待节点。因此当用户执行他们的任务,任务完成将触发执行继续。换句话说,令牌将调用一个新的信号。
- 状态(State):
状态是一个单纯的等待状态。它没有任务实例在任务清单中创建,这在流程需要等待外部系统的时候非常有用。如:以上的节点入口中(node-enter事件中的动作),一个消息将被发送到外部系统,随后流程进入等待状态,当外部系统发回消息的时候,发送token.signal()方法触发流程继续往下执行
- 决策(Decision):
在jBPM中有两个方法来进行决策,它们之间的主要区别在于由“谁”来进行决策,其中一个是由流程来做出决定,另外一个是通过外部的实体来提供一个决策的结果。 - 分支(fork):
一个分支把一个执行路线分割成多个并行的执行路线。默认分支的行为是为每个分支转换建立一个子令牌,在令牌要到达的分支之间建立一个父子关系
- 联合(join):
默认的联合假设所有来自同一个父亲的子令牌结合,上面介绍的分支发生的时候并且所有令牌分支创建之后,而且所有分支都到达同一个联合时,当全部令牌都进入联合的时候,联合就结束了。
- 节点(Node):
节点类型是用来完成在节点中编写自己的程序代码,它需要一个动作的子元素,用来在执行路径到达节点的时候执行,编写在actionhandler中的代码可以实现任何的逻辑,同时它必须负责传播执行。他和任务节点的区别就在于它不需要等待用户做出响应就流程继续往后执行,而任务节点只有用户做出响应后流程才会继续
当有一个流程需要来做一个决策的时候就要使用一个决策节点。有两个方式来指定决策的标准,最简单的方式是给转换增加一个条件,条件是一个返回结果为boolean的EL表达是或beanshell脚本表达。
在运行时决策代码会被转换反复调用(按照XML指定的顺序)来评估每个条件,但条件值为“true”的时候就会发生转换,如果所有的条件都返回“false”的话,默认的转换将被执行(XML定义中的第一个)。
另外一种方式是使用一个表达式来返回转换的名称,使用属性“expression”,可以为决策节点来指定一个表达式来决定如何转换。
还有一种方式是指定一个“handler”属性,它需要是DecisionHandler接口的实现,在Java类中决策的转换由DecisionHandler实现中的决策方法(decide-method)来返回。
当决策是由外部合作者来决定(含义:不是流程定义的一部分),可以用多个转换离开状态或等待状态节点,然后转换可以提供外部的触发在等待状态完成后继续执行。比如 Token.signal(String transitionName) and TaskInstance.end(String transitionName).
四, 转换
转换有一个来源节点和一个目标节点,来源节点通过一个from属性来指定,目标节点通过一个to属性来指定
一个转换有一个可选的名称,很多jBPM都依赖于唯一的转换名称,如果有多个转换都拥有同样的名称,那第一个转换将会被选中执行,重复的转换名称将会导致Map getLeavingTransitionsMap() 方法返回的元素数量少于 List getLeavingTransitions() ,列表中默认的转换是第一个转换。
五,动作(Actions)
动作其实就是一段 Java 代码,在有事件发生时执行流程,流程的图在软件需求社区是一个很重要的指令,但是图只是将要实现软件的一个视觉(投射),它隐藏了技术的实现细节。动作是在图形化表示之外加入技术细节的机制,当一个图被创建,它可以用加入动作来进行装饰,这样通过 Java 代码在不修改图结构的情况下可以和图关联起来了,主要的事件类型是:进入节点、离开节点和执行转换。
下一篇文章将描述变量的上下文。
–
相关文章: