JBPM基于Spring系统工作流平台整合(二)
 

2010-03-01 作者:wangyisong 来源:javaeye.com

 

3-JBPM

基本概念

令牌token:表示了一个执行的路径,它是运行时产生的。令牌代表一个流程执行的路径,它维护着流程定义中各个结点的指针,同时记录了流程当前执行的位置。

jBpm采用Token来表示当前实例运行的位置,也利用token在流程各个点之间的转移来表示流程的推进。JBpm没有节点实例NodeInstance这个概念。利用Token和TaskInstance,JBpm足以持久化足够的信息,能够让流程实例迅速定位到当前运行的状态。

节点node:表示流程中的一个节点1.实现某个指定行为,在JBPM中就是执行一段指定的Java代码;2.转递、维持流程的延续,直至达到最终结点。

转移transition:关联两个节点,用于表示节点的走向。当一个Node中存在有多个同名的transition的时候,第一个transition将会被选中。

发信号signal:让一个token执行下一步。当token进入到一个node时,node会被执行,并产生一些事件,比如进入、离开节点等,这也是执行业务逻辑的地方。事件由action来表示。

任务Task:任务作为流程定义中的一部分,定义了如何创建任务实例(Task instances)以及任务分配。任务可以在任务结点(Task-Node)和流程定义(process-definition)两个地方定义。在整个的流程定义中,任务名必须是唯一的。可以给任务设定优先级,任务实例可以在之后的运行中改变优先级。

任务实例Task Instance:一个任务实例对象可以分配给指定操作者处理,完成后,触发流程继续下行。任务实例生命周期:生成实例-->开始处理-->任务结束。任务实例记录着任务创建的时间、结束时间,这些信息可以通过TaskInstance对象中的getter方法获取。

节点定义

1、node(自动节点)

这种节点和State相反,也称自动节点。当业务程序实例执行到这个节点不会停止执行。而是会继续往下执行。如果该节点存在多个离开转向。那么,就会执行其中的第一个离开转向,在Node状态中,不需要外部参与者的参与,业务流程的这个部分是自动的、即时完成的。

2、state(状态)

State节点也叫手工节点,进入到这种节点,整个流程的执行就会中断。直到系统外参与者发起继续执行的命令,即调用signal或end方法,业务程序实例的执行才能够继续下去。

3、task-node (任务节点) 

其性质和node节点一样,在没有task的时候,也都是自动执行,不等待。task-node被归类为一个等待节点,是指在task-node中的task列表中的task没有全部执行完之前,它会一直等待。Task可以在task-node节点下定义,也可以在process-definition节点下。

<task-node name='a'>
<task name='laundry' />
<task name='dishes' />
<task name='change nappy' />
<transition to='b' />
</task-node>

a) 这里没有定义signal属性的值,这就表明当节点中的三个任务都完成后,流程才进入后面的节点

b) 当<task-node name='a' signal='unsynchronized'>表明token不会在本节点停留,而是直接到后面的节点

c) 当<task-node name='a' signal='never'>表明三个任务都完成后,token仍然不会指向后面的节点;需要自己手动调用processInstance.signal()才会驱动流程到下面的节点

d) 当<task-node name='a' signal='first'>表明只要有一个任务完成后,token就指向后面的节点

e) 当<task-node name='a' signal='first-wait'>表明当第一个任务实例完成时继续执行;当在a节点入口处没有任务创建时,token在a任务节点处等待,直到任务被创建或完成。

f) 当<task-node name='a' signal='last'>时,这是默认值,和不设置signal属性的情况相同。

g) 当<task-node name='a' signal='last-wait'>时,当最后一个任务实例完成时候继续执行下去。 当a这个任务节点没有任务被建立时,任务节点等待直到任务被建立。

4、fork(分支) 

一个fork把一个执行路线分割成多个执行路线. 默认分支的行为是为每个离开分支转换建立一个子令牌,在令牌要到达的分支之间建立一个父母-子女关系

一般来说,fork和join需要一起配对使用,一个fork对应一个join,否则流程执行会有问题

5、join(联合)

在上使用fork(分支)这个情形就出现了并且所有令牌分支建立,并且到达同一个联合(join)。当全部令牌都进入联合的时候联合就结束了, 然后联合将检查父母-子女,当所有兄弟令牌到达联合(join),父母令牌将传播(唯一的)离开转换,当还有兄弟令牌活动时,联合的行为将作为等待状态。

6、decision(决策) 

一个decision用以决定在多个执行路径中哪个才可以被执行。一个decision能够具有许多离开的transition,Handler所指定的DecisionHandler的实现类里的decide方法返回一个字符串,表示要执行哪个transition

7、Superstate

是用来对node进行分组的. 而且可以被嵌套使用, 一般在复杂的流程设计中使用(比如流程中的node有一定的层次关系), 其好处能对进入Superstate中的任意的一个node进行统一的控制(通过独有的两个事件superstate-enter and superstate-leave)

8、transition(转换)

转换用来指定节点之间的连接。transition元素放在node里面,那么这个transition就会从这个节点出离开。

9、event(事件)

JBPM定义了一系列与工作流节点元素相关联的事件,流程实例运行过程中,可以触发节点进入(node-enter)、节点离开 (node-leave)、流程启动(process-start)、流程结束(process-end)、任务创建(task-create)、 任务分派(task-assign)、任务启动(task-start)等事件。

10、action(动作)

一个action是一段java代码。在流程执行期间在一些事件之上定义,这样会在相关事件触发时自动在工作流引擎上执行。

11、script(脚本)

Script里是动作执行的beanshell脚本. 更多有关beanshell的的信息请参考Beanshell的网站:http://www.beanshell.org

12、expression(表达式)

Expression里可书写Beanshell脚本

13、variable(变量)

一个是变量是一种key-value对。它与过程实例(一次过程执行)相关联。

14、handler(句柄) 

Handler是在定义一个decision时需要为其定义一个DecisionHandler时才用。

15timer(定时器)

定时器以设置开始时间duedate和频率repeat。

4-系统中间层设计

目的:为了可以和任一第三方工作流平台(wfmc标准)整合。

中间层BEAN类定义
/**
 * 工作流流程定义类,也就是某一工单对应的模型定义
 * @author Wang YiSong
 */
public class WfProcessDef implements Serializable {
    long processDefId; //流程定义Id
    String processDefName; //流程定义名称
……
}

/**
 * 流程定义中的节点,也就是流程扭转过程中的具体操作的抽象
 * @author Wang YiSong
 */
public class WfNodeDef implements Serializable {
    long nodeId; //节点定义id
    String nodeName; //节点定义名称
……
}

/**
 * 工作流流程实例类,一个工单对应一个流程实例
 * @author Wang YiSong
 */
public class WfProcessIns implements Serializable {
    long processInsId; //流程实例Id
    long processDefId; //流程定义Id
 ……
}

/**
 * 工作流任务实例类,具体流程实例每一个节点对应的具体任务,一个节点可能对应多个任务实例(如:会签,或者一个节点需要多个顺序的任务完成)
 * @author Wang YiSong
 */
public class WfTaskIns implements Serializable {
    long taskInsId; //任务实例Id
    String taskInsName; //任务实例名称
……
}
工作流中间层接口定义
/**
 * 工作流系统调用接口,系统调用该接口,不直接调用第三方工作流引擎提供的api
 * 这样系统和任一第三方流程引擎整合可以将引擎之间的差异通过该接口定义屏蔽,也就是说该接口对于系统是透明的
 *
 * @author Wang YiSong
 */
public interface WfManageService {
    /**
     * 部署发布流程定义
     */
    public void deployWfProcessDef(ZipInputStream zStream);  
    /**
     * 获取所有流程定义
     */
    public List getAllWfProcessDefs();
    /**
     * 根据流程定义名称创建一个流程实例.
     */
    public WfProcessIns createWfProcessIns(String wfProcessDefName);  
    /**
     * 启动流程
    */
    public void startWfProcessIns(long wfProcessInsId);  
    /**
     * 根据用户Id获取待办任务,返回WfTaskIns对象的集合
     */
    public List getWfTaskInsLsByUserId(String userId);   
    /**
     * 更新流程全局变量和相关节点有关变量
     */
    public void setRelevantVariable(long wfProcessInsId, HashMap<String, String> varMap);   
    /**
     * 启动执行任务,在实际业务中类似签收的作用
     */
    public void startWfTaskIns(long wfTaskInsId);  
    /**
     * 完成任务,当前任务实例的结束,下一个节点的初始化
     */
    public void completeWfTaskIns(long wfTaskInsId);   
     ......
} 



专家视角看IT与架构
软件架构设计
面向服务体系架构和业务组件
人人网移动开发架构
架构腐化之谜
谈平台即服务PaaS


面向应用的架构设计实践
单元测试+重构+设计模式
软件架构师—高级实践
软件架构设计方法、案例与实践
嵌入式软件架构设计—高级实践
SOA体系结构实践


锐安科技 软件架构设计方法
成都 嵌入式软件架构设计
上海汽车 嵌入式软件架构设计
北京 软件架构设计
上海 软件架构设计案例与实践
北京 架构设计方法案例与实践
深圳 架构设计方法案例与实践
嵌入式软件架构设计—高级实践
更多...   
 
 
 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号