`
tryonmind
  • 浏览: 117722 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JBPM 总结

阅读更多

 

转自:http://guanhw.blog.hexun.com/13283204_d.html

 

jPDL的流程定义元素
第一层级:GraphElement

这个容易理解,因为在画流程定义时,每个拖拉的对象都是一个graph的元素.

GraphElement有四个属性:1)processDefine 表示当前元素属于哪个流程定义

2)events 表示可以接收哪些event

3)name 名字

4)exceptionHandlers 异常处理类集合(List)

第二层级:node;processDefinition;Transition;Task 它们都inherited from GraphElement

1)processDefinition表示流程定义(implements NodeCollection),它有下面的属性:name,version,nodes,startState nodes表示流程中所有的node,startState用于启动流程时找到首节点

2)Transition表示转移,它有三个属性:from(Node),to(Node),supportedEventTypes表示支持的event类型

3)node表示节点,它有四个属性:leaving transitions;arriving transitions;action;superState

4)Task 定义任务

第三层级:各种不同的node,它们都inherited from node decision;EndState;Fork;Join;Merge;Milestone; InterleaveEnd;InterleaveStart;ProcessState;State 这些都是见名知义,和xpdl差不多.
jbpm的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)根据令牌的位置,流程的状态已经发生改变.


1、process definition
一个process definition代表了一个正式的业务流程,它以一个流程图为基础。这个流程图由 许多node和transition组成。每个node在这个流程图里都有着各自特殊的类型,这些不同的类型决定了node在运行时的不同行为。一个process definition只有一个start state 。
2、token
一个token代表了一条执行路径,它包含了这条执行路径的当前的执行状态(current state)。
3、process instance
一个process instance(流程实例)即一个process definition(流程定义)的流程执行实例。一个process definition可以对应多个process instance。当一个process instance被创建的时候,一个主执行路径token同时被创建,这个token叫做root token,它指向流程定义的start state(processDefinition.getStartState()==token.getNode())。
4、signal
一个signal 发送给token通知token 继续流程的执行。如果signal 没有指定transition,token将沿缺省的transition离开当前状态,如果signal 指定transition,token将沿指定的transition离开当前的状态。看源代码可以看到发给process instance的signal 其实都是发送给了root token。
5、Actions
jbpm提供了灵活的action ,当流程执行,token 进入node和transition时,会触发相应的一些event(事件)。在这些event上附上我们自己写的action,就会带动action 的执行。action里是我们自己的相关java操作代码,非常方便。注意的是event(事件)是内置的,无法扩展。另外,action也可以直接挂在node上,而不依赖于event(事件)的触发,这个很重要!
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的结束和流程的结束。

流程图中的node type


1、task-node
一个task-node可以包含一个或多个task,这些task分配给特定的user。当流程执行到task-node时,task instance将会被创建,一个task对应一个task instance。task instances 创建后,task-node就处于等待状态。当所有的task instances被特定的user执行完毕后,将会发出一个新的signal 到token,即流程继续执行。
2、state
state是一个纯粹的wait state(等待状态)。它和task-node的区别就是它不会创建task instances。很典型的用法是,当进入这个节点时(通过绑定一个action到node-enter event),发送一条消息到外部的系统,然后流程就处于等待状态。外部系统完成一些操作后返回一条消息,这个消息触发一个signal 到token,然后流程继续执行。(不常用)
3、decision
当需要在流程中根据不同条件来判断执行不同路径时,就可以用decision节点。两种方法:最简单的是在transitions里增加condition elements(条件),condition是beanshell script写的,它返回一个boolean。当运行的时候,decision节点将会在它的 leaving transitions里循环,同时比较 leaving transitions里的condition,最先返回'true'的condition,那个leaving transitions将会被执行;作为选择,你可以实现DecisionHandler接口,它有一个decide()方法,该方法返回一个String(leaving transition的名字)。
4、fork
fork节点把一条执行路径分离成多条同时进行(并发)的执行路径,每条离开fork节点的路径产生一个子token。
5、join
默认情况下,join节点会认为所有到达该节点的token都有着相同的父token。join 节点会结束每一个到达该节点的token,当所有的子token都到达该节点后,父token会激活。当仍然有子token处于活动状态时,join 节点是wait state(等待状态)。
6、node
node节点就是让你挂自己的action用的(注意:不是event触发!!),当流程到达该节点时,action会被执行。你的action要实现ActionHandler接口。同样,在你的action里要控制流程!

Actions的说明


存在两种action,一种是 event触发的action,一种是挂在node 节点的action。要注意它们的区别,event触发的action无法控制流程,也就是说它无法决定流程经过这个节点后下一步将到哪一个leaving transition;而挂在node 节点的action就不同,它可以控制流程。不管是哪一种action都要实现ActionHandler接口。
variable的管理


流程实例中,存有contextInstance来管理token和variable.
contextInstance是通过一个map来进行管理的,这个map的key是token,value是一个TokenVariableMap的对象.

TokenVariableMap本身并不是个map,而是一个普通的Object

TokenVariableMap有三个属性,一个是contextInstance,一个是Token对象本身,还有一个是
一个Map,用来放variableInstance,这个Map的名称为variableInstances.

variableInstances是一个map,它的key是variable的名称,如"a",value是一个VariableInstance对象,VariableInstance对象放了四个属性,一个是token对象本身,一个是variable的名称,一个是TokenVariableMap对象,还有一个是processInsance,你可能会奇怪:variable的value放到哪里呢?实际上VariableInstance是一个抽象类,具体的实现是它根据value的class类型选择它的子类,子类中有个属性叫value。这个variable的value,如 new Integer(3).

一个流程实例可以有多个Token,Token间是有父子关系的:
Token tokenAB=new Token(tokenA,"ab");
上行代码的意思是在tokenA下面建立一个TokenAB,该新建的
Token的名字是"ab".

ci.createVariable(tokenA, "a", new Integer(3));
表示在tokenA范围内建立一个variable,它的名称为"a",
值为new Integer(3)
建立这个variable后,tokenA下面的token都可以看到该
variable,而上面的token则看不到.

只有createVariable可以在某个token上建立variable,其它的
方法只可以在rootToken上建立variable.
如:ci.setVariable(tokenA, "a", new Integer(3));
其实是在rootToken上建立了一个名称为"a"的variable
Map variables = new HashMap();
variables.put("a", new Integer(3));
variables.put("b", new Integer(4));
ci.addVariables(variables);
上面四行代码在rootToken上建立了两个variable.
实际上在ExecutionContext中只有两个方法:
public void setVariable(String name, Object value) {
getContextInstance().setVariable(name, value, token);
}
public Object getVariable(String name) {
return getContextInstance().getVariable(name, token);
}
可以在子token中修改父token中建立的variable.

Task(任务)


jbpm一个相当重要的功能就是对任务进行管理。
Task(任务)是流程定义里的一部分,它决定了task instance的创建和分配。
Task(任务)可以在task-node节点下定义,也可以挂在process-definition节点下。最普遍的方式是在task-node节点下定义一个或多个任务。默认情况下,流程在task-node节点会处于等待状态,直到所有的任务被执行完毕。任务的名称在整个流程中必须是唯一的。

一个TaskNode对应多个Task
对于这样的流程定义:
 
 
 
 
 
 
只有当节点中的三个任务都完成后,流程才进入后面的节点

对于这样的流程定义:
>
 
 
 
 
 
当第一个任务完成后,token就指向后面的节点

对于这样的流程定义:
>
 
 
 
 
 
三个任务都完成后,token仍然不会指向后面的节点;需要自己手动调用

processInstance.signal()才会驱动流程到下面的节点

对于这样的流程定义:
>
 
 
 
 
 
token不会在本节点停留,而是直接到后面的节点

jbpm的任务管理实现
一个Task instance(任务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的任务清单时,你就可以通过一个与用户关联的actorId来查询这张表。

一个流程定义有一个TaskMgmtDefinition;一个TaskMgmtDefinition对应多个swimlane,同时对应多个task;一个swimlane有多个task,可以从TaskMgmtDefinition中通过task的名称直接获取相应的task;

swimlane对象有四个属性,分别是name(名字)、assignmentDelegation(分配代理类)、taskMgmtDefinition、tasks(Set 对应多个task),可以增加task

task对象主要的属性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNode,需要注意的是swimlane和assignmentDelegation中间只是可以一个属性有值,因为它们都和任务的分配有关系。

一个流程实例有一个TaskMgmtInstance;一个TaskMgmtInstance对应多个swimlaneInstance,同时对应多个taskInstance;一个swimlaneInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance;

swimlaneInstance对象主要有五个属性,分别是name、actorId、pooledActors(Set)、swimlane、taskMgmtInstance。
taskInstance对象的主要属性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors。

当对任务进行分配时,一般需要实现AssignmentHandler这个接口,这个接口的方法只有一个:
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一个典型的实现(把名字是'change nappy'的任务交给NappyAssignmentHandler这个类来分配)
 
 
 
NappyAssignmentHandler类:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同样,Assignable只是一个接口,它有两个方法:setActorId()和setPooledActors(),Assignable的具体实现类也是两个
swimlaneInstancehe和taskInstance。这样就不不难理解整个任务分配流程了:
1、流程进入TaskNode节点,执行TaskNode类的execute()方法,该方法首先获得TaskMgmtInstance实例,然后通过它来创建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)里,该方法调用了taskInstance.assign(executionContext)对taskInstance进行分配。
3、在assign(executionContext)方法里,首先会判断task属性里是否存在swimlane,如果有的话,这个taskInstance就会分配给swimlane指定的ActorId或 PooledActors;如果不存在,再去找task属性里 assignmentDelegation(分配代理类)通过代理类(即我们自己写的实现AssignmentHandler这个接口的类)指定ActorId或 PooledActors。
jbpm的用户角色管理


jbpm在用户角色管理上共设计了四个类:Entity、 Membership、 Group、 User
Entity类是其他三个类的父类,它包含了两个属性:name(String)、 permissions(Set)
User类继承Entity类,包含三个属性:password(String)、 email(String)、 memberships(Set)
Group类继承Entity类,包含四个属性: type(String) 、parent(Group)、 children(Set)、 memberships(Set)
Membership类继承Entity类,包含三个属性:role(String)、 user(User)、 group(Group)
很明显,一个user对应一个用户,一个group对应一个用户组,它们之间通过membership关联,并且一个user可以属于多个不同类型(type)的group,user和 group之间是多对多的关系。
Membership类的role属性个人感觉用途不大,反倒是name属性代表了user在group里的role(角色)!

分享到:
评论

相关推荐

    jBPM4学习总结

    【jBPM4学习总结】 jBPM,全称为Java Business Process Management,是一个开源的、灵活且可扩展的业务流程管理框架,涵盖了业务流程管理、工作流和服务协作等多个领域。自2004年10月加入JBoss组织后,jBPM逐渐成为...

    JBPM3总结.docx

    总结来说,JBPM3是一个强大的业务流程管理工具,通过XML描述流程,利用Hibernate进行数据管理,提供了轻量级的依赖和灵活的部署选项。其核心概念如流程定义、流程实例、令牌和事件,共同构建了一个完整的业务流程...

    jbpm3.2开发总结.pdf

    本文主要围绕jbpm3.2在开发过程中的关键概念、组件、API使用以及配置等知识点进行总结。 首先,了解jbpm3.2需要掌握Java语言,J2EE技术栈,特别是Hibernate,因为在jbpm3.2中,流程定义、任务实例等数据的持久化是...

    jbpm简介\jbpm简介

    #### 五、总结 综上所述,jBPM是一个功能强大、易于使用的商业流程管理工作流引擎。它不仅具备丰富的特性和高度的灵活性,而且在实际应用中也表现出了出色的稳定性和性能。对于寻求提高业务流程管理效率、简化软件...

    JBPM4 学习使用总结

    **JBPM4 学习使用总结** JBPM4(Java Business Process Management)是Jboss公司推出的一款开源的工作流管理系统,它提供了完整的业务流程自动化解决方案,包括流程设计、部署、执行、监控以及管理等功能。在深入...

    jBPM3.2.rar_JBPM3.2_jbpm_jbpm 3.2_jbpm3_jbpm3.2教程

    **jbPM 3.2 知识点详解** jbPM,全称为Java Business Process Management,是一个开源的工作流管理系统,主要用于企业级应用中的业务流程管理。...希望这份知识总结能对你在jbPM的学习和使用上提供帮助。

    jbpm3基本资料和代码总结

    **jbpm3基本资料与代码总结** jbpm(Java Business Process Management)是一个开源的工作流管理系统,专注于业务流程的建模、执行和管理。jbpm3是该系统的第三个主要版本,它提供了一整套工具和API,帮助开发者...

    JBPM4学习经验总结

    JBPM4学习经验总结 JBPM4是Java Business Process Management(业务流程管理)的缩写,它是一个开源的、灵活的、易扩展的可执行流程语言框架。JBPM4学习经验总结包括了JBPM4的概念、配置JBPM4开发环境、JBPM默认的...

    jbpm工作流引擎总结文档

    jbpm工作流引擎基于J2EE的轻量级,纯java,开源的工作流管理系统。

    jbpm-2.0-beta1.zip_java 工作流引擎_jbpm_jbpm-demo_工作流_工作流引擎

    总结来说,jbpm是一个强大的Java工作流引擎,具有流程建模、执行和管理的全面功能,适合用于构建企业级工作流系统。jbpm-demo提供了丰富的示例,帮助开发者快速上手,而jbpm-2.0-beta1的压缩包则包含了实现这些功能...

    JBPM笔记总结-1

    JBPM笔记总结,最最经典的,初学者的必看

    JBPM阶段性工作总结

    请把webwork、spring、hibernate和jbpm的所有jar包放入web-inf的lib下。然后将这个rar包下的jbpm3.2.1的sql导入mysql中。大家可以用src里面的两个XXXTest测试用例跑一下,代码很粗糙,需要大量重构,请见谅。只是...

    jbpm4web-JBPM4的一个web版本的Demo

    总结来说,jbpm4web是一个实用的学习工具,它使开发者能够深入了解JBPM4的运作机制,并快速上手实践。通过这个Demo,你可以掌握流程设计、执行、管理和监控的关键技术,为实际项目开发打下坚实的基础。

    流程开发java插件jbpm 使用说明 个人总结

    【JBPM简介】 JBPM,全称JBOSS Business Process Management,是一个基于Java的开源工作流管理系统。它提供了一种灵活且可扩展的方式来设计、执行和管理业务流程。JBPM利用直观的流程语言,如任务、异步等待状态、...

    JBPM4.4完整可用审批流程

    这些报错指南可能是开发者根据经验总结出的常见问题解决方案,或者是官方文档中的错误处理部分,对于快速定位和解决问题非常有帮助。 在jbpm4_maven目录下,我们可以期待找到以下内容: 1. **源代码**:包括业务...

    jbpm实战讲解.pdf

    #### 四、总结 JBPM作为一款成熟且功能全面的工作流框架,其丰富的特性和灵活性为企业应用带来了显著的价值。通过上述知识点的梳理,我们不仅了解了JBPM的基本构建与部署流程,还深入探讨了其核心概念和实践技巧。...

    jbpm中文教程-详细

    总结,jbpm作为企业级的业务流程管理工具,其强大之处在于它提供的完整流程生命周期管理、灵活的流程定义和强大的数据持久化能力。结合Hibernate的集成,jbpm成为Java开发人员实现高效流程自动化和管理的理想选择。...

    jbpm jar java

    总结来说,jbpm是一个功能丰富的Java工作流管理框架,它通过提供强大的API和工具,让开发者能够轻松地构建、执行和管理业务流程。在实际开发中,理解jbpm的核心概念、API使用以及最佳实践,将有助于构建高效、灵活的...

Global site tag (gtag.js) - Google Analytics