天天看点

jbpm的Token,node

Token

jbpm中最重要的概念,应该是令牌(Token)和信令(Signal)



在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的current state。在解决“并行”等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命:(1)快速定位current state (2)用于fork,join算法 (3)用于告知任务执行者的任务索引。



如下代码:



//pd是process definition,pi是process instance ProcessInstance



pi = new ProcessInstance( pd );



//得到根令牌



Token token = pi.getRootToken();



//发信令



token.signal();



Token的signal方法也可以传入transition参数,这个方法把信令发送给Token,这样,令牌将被激活,并沿指定的transition离开当前的状态(如果没有指定transition,将沿缺省的transition 离开当前状态).



jbpm是怎么实现的呢?其实很简单:



1)Token记录了当前的状态(current state),只有当前的状态(或称节点)拥有该令牌



2)向TOKEN发signal后,当前状态收到该signal



3)当前状态把令牌传给signal中指定的transition



4)transition收到令牌后,不强占,马上把令牌传给下个状态.



5)根据令牌的位置,流程的状态已经发生改变.

node

一个流程图由许多node和transition组成。每个node都有一种类型,这个类型决定了当流程执行到这个node时的不同行为。jbpm有一组node type可以供你选择,当然你可以定制自己node 。

node的作用

node有两个主要的作用:

1)执行java代码,比如说创建task instance(任务实例)、发出通知、更新数据库等等。很典型的就是在node 上挂上我们的action

2) 控制流程的执行:

A、等待状态

流程进入到这个node时将处于等待状态,直到一个signal 的发出

B、流程将沿着一个leaving transition越过这个node

这种情况特殊一点,需要有个action挂在这个node上(注意这个action不是event触发的!),action中将会调用到API里

executionContext.leaveNode(String transitionName),transitionName即这里的leaving transition名字。

C、创建新的执行路径

很典型的就是fork node。流程在这里会分叉,产生新的执行路径。这样就创建了新的token,每个新的token代表一个新的执行路径。注意的是,这些新的token和产生前的token是父子关系!

D、结束执行路径

一个node可以结束一条执行路径,这同样意味着相应的token的结束和流程的结束。