http://opensourceforce.org/thread-58-1-1.html
1. JPDL的流程定义元素
1) 第一层:GraphElement
这个容易理解,因为在画流程定义时,每个拖拉的对象都是一个graph的元素。GraphElement有四个属性:
(1)processDefine 表示当前元素属于哪个流程定义
(2)events 表示可以接收哪些event
(3)name 名字
(4)exceptionHandlers 异常处理类集合(List)
2) 第二层:node、processDefinition、Transition、Task
它们都继承自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 定义任务
3) 第三层:各种不同的node
它们都继承自node。 Decision、EndState、Fork、Join、Merge、Milestone、 InterleaveEnd、InterleaveStart、ProcessState、State。
2. 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)根据令牌的位置,流程的状态已经发生改变.
3. process definition
一个process definition代表了一个正式的业务流程,它以一个流程图为基础。这个流程图由许多node和transition组成。每个node在这个流程图里都有着各自特殊的类型,这些不同的类型决定了node在运行时的不同行为。一个process definition只有一个start state 。
4. token
一个token代表了一条执行路径,它包含了这条执行路径的当前的执行状态(current state)。
5. process instance
一个process instance(流程实例)即一个process definition(流程定义)的流程执行实例。一个process definition可以对应多个process instance。当一个process instance被创建的时候,一个主执行路径token同时被创建,这个token叫做root token,它指向流程定义的start state(processDefinition.getStartState()==token.getNode())。
6. signal
一个signal 发送给token通知token 继续流程的执行。如果signal 没有指定transition,token将沿缺省的transition离开当前状态,如果signal 指定transition,token将沿指定的transition离开当前的状态。看源代码可以看到发给process instance的signal 其实都是发送给了root token。
7. Actions
jbpm提供了灵活的action ,当流程执行,token 进入node和transition时,会触发相应的一些event(事件)。在这些event上附上我们自己写的action,就会带动action 的执行。action里是我们自己的相关java操作代码,非常方便。注意的是event(事件)是内置的,无法扩展。另外,action也可以直接挂在 node上,而不依赖于event(事件)的触发,这个很重要。
8. 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的结束和流程的结束。
9. 流程图中的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里要控制流程。
10. Actions的说明 存在两种action,一种是 event触发的action,一种是挂在node 节点的action。要注意它们的区别,event触发的action无法控制流程,也就是说它无法决定流程经过这个节点后下一步将到哪一个 leaving transition;而挂在node 节点的action就不同,它可以控制流程。不管是哪一种action都要实现ActionHandler接口。
11. Task(任务) jbpm一个相当重要的功能就是对任务进行管理。Task(任务)是流程定义里的一部分,它决定了task instance的创建和分配。Task(任务)可以在task-node节点下定义,也可以挂在process-definition节点下。最普遍的方式是在task-node节点下定义一个或多个任务。默认情况下,流程在task-node节点会处于等待状态,直到所有的任务被执行完毕。任务的名称在整个流程中必须是唯一的。一个TaskNode对应多个Task。
对于这样的流程定义:
xml 代码
<task-node name='a'>
<task name='laundry' />
<task name='dishes' />
<task name='change nappy' />
<transition to='b' />
</task-node>
只有当节点中的三个任务都完成后,流程才进入后面的节点
对于这样的流程定义:
xml 代码
<task-node name='a' signal='first'>>
<task name='laundry' />
<task name='dishes' />
<task name='change nappy' />
<transition to='b' />
</task-node>
当第一个任务完成后,token就指向后面的节点
对于这样的流程定义:
xml 代码
<task-node name='a' signal='never'>>
<task name='laundry' />
<task name='dishes' />
<task name='change nappy' />
<transition to='b' />
</task-node>
三个任务都完成后,token仍然不会指向后面的节点;需要自己手动调用processInstance.signal()才会驱动流程到下面的节点。
对于这样的流程定义:
xml 代码
<task-node name='a' signal='unsynchronized'>>
<task name='laundry' />
<task name='dishes' />
<task name='change nappy' />
<transition to='b' />
</task-node>
token不会在本节点停留,而是直接到后面的节点
12. 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这个类来分配)
xml 代码
<task name='change nappy'>
<assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />
task> NappyAssignmentHandler类:
java 代码
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。
13. 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(角色)。
分享到:
相关推荐
开发者可以通过指南学习到jbpm的核心概念,如流程定义语言(bpmn2.0)、工作流引擎的使用以及异常处理机制。 3. **jbpm5用户手册**: jBPM5_用户手册-中文版为开发者提供了jbpm5的详细操作指南,包括新特性和改进...
"JBPM3.1Help(中文).chm"可能包含了关于jbpm3的安装步骤、API使用、工作流设计等方面的中文帮助文档,这对于初学者了解jbpm3的基础操作和核心概念非常有帮助。 "jbpm开发指南.pdf"可能是对jbpm4或更高版本的开发者...
最后,对于Struts2,你需要了解其拦截器、Action、结果类型等核心概念,以便在jbpm流程中正确调用和响应前端请求。 总的来说,jbpm是企业级流程管理的强大工具,与Struts2的整合可以为企业提供一个灵活且可扩展的...
通过jBPM-jPDL学习笔记,你可以系统地学习如何使用jPDL设计和实施业务流程,掌握jbpm的核心概念和技术。无论是对于开发人员还是业务分析师,这份资料都将极大地提升你在工作流管理领域的专业技能。
虽然“工作流”和 BPM 的概念已经提出多年,并承诺提供企业应用集成,但由于缺乏真正统一的标准及企业软件架构模型的影响,它们的主流接受度一直受限。市场上存在大量的工作流和 BPM 产品,通常售价高达六位数,主要...
本资源“4流实战_工作流中的概念与JBPM相关API调用”聚焦于这一主题,通过JBPM(Java Business Process Management)这一开源工作流引擎,深入探讨工作流的核心概念以及如何通过API来实现相关功能。 首先,我们要...
"JBPM用户指南.doc"文档是jbpm的重要参考资料,它详细介绍了如何使用jbpm进行流程设计、部署、执行以及相关的API使用方法。建议初学者首先阅读这份文档,理解jbpm的基本概念和操作,然后通过实际项目练习,掌握jbpm...
- **JBPM4_ID_GROUP**,**JBPM4_ID_MEMBERSHIP**,**JBPM4_ID_USER**:身份认证相关表,管理用户、组和成员关系。 - **JBPM4_JOB**:定时任务表,用于调度未立即执行的操作。 - **JBPM4_LOB**:存储大型对象,如...
1. **jbpm核心概念** - **工作流模型**:jbpm使用JPDL(jBPM Process Definition Language)来定义工作流程。JPDL是一种基于XML的语言,用于描述任务的顺序、分支、循环等逻辑。 - **流程实例**:每个运行中的流程...
"JBPM7基础开发" JBPM7 基础开发是基于流程引擎的开发方式和实现方式的简单说明。流程引擎是一个自动化管理和优化流程的工具,旨在提高不同部门之间业务的整合效率,降低开发和维护成本。 概念1:BPM(业务流程...
【MyEclipse 10 JBPM 配置详解】 MyEclipse 10 是一款强大的Java集成开发环境,它支持...记得在开发过程中不断学习和熟悉JBPM的相关概念和技术,如工作流定义、任务节点、事件处理等,以提升你的业务流程管理能力。
这套教程分为四个部分,旨在帮助初学者和有一定基础的学习者逐步掌握jbpm的核心概念、进阶技术和实际应用开发。 在【JBPM_(1)_Basics_new.ppt】中,你将学习到jbpm的基础知识,包括jbpm框架的概述、它在BPM领域中的...
JBPM_MODULEDEFINITION JBPM_MODULEDEFINITION FK_MODDEF_PROCDEF PROCESSDEFINITION_ 一个流程可能处在很多的模块(模块概念不理解) JBPM_DELEGATION JBPM_DELEGATION FK_DELEGATION_PRCD PROCESSDEFINITION_ 一...
4. 数据库配置:jbpm需要数据库存储流程实例和相关数据,如MySQL、Oracle等,根据文档配置数据库连接。 三、jbpm入门示例 在这个"myjbpm"压缩包中,你可能找到了一个简单的jbpm流程示例,通常包括以下组成部分: 1....
**jbpm关键概念** - **流程定义(Process Definition)**:描述了业务流程的结构和规则,通常以BPMN(Business Process Modeling Notation)图形化方式表示。 - **任务(Task)**:流程中的一个个活动,每个任务...
5. **jBPM关键概念**: - **流程定义**:预先定义的业务流程逻辑。 - **流程实例**:业务的实际执行过程。 - **参与者**:执行任务的个体或系统。 - **活动(任务)**:流程中的操作节点。 - **活动实例**:...
为了全面利用jbpm-4.4,开发者需要熟悉Java编程和相关的BPM概念,同时了解如何配置和部署jbpm环境。这可能涉及设置数据库连接、配置服务器、导入项目到IDE(如Eclipse)以及编写和部署流程定义。jbpm还提供了API和...