- 浏览: 50197 次
- 性别:
- 来自: 自己输入
文章分类
最新评论
-
aa00aa00:
正想学习JPBM工作流,看了您的文章,受益菲浅,谢谢了!!
jBPM学习(一)----环境搭建 -
elvishehai:
把你项目直接上传过来吧,
jBPM学习(二)----数据库迁移 -
zoutuo:
50行是这个:properties="${based ...
jBPM学习(二)----数据库迁移 -
zoutuo:
BUILD FAILEDD:\workspace\jbpm.3 ...
jBPM学习(二)----数据库迁移 -
zoutuo:
打包war成功,部署后启动tomcat出错:严重: Excep ...
jBPM学习(三)----将jbpm从jboss迁移到tomcat5.5
七、 jBPM 相关概念
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 离开当前状态 ) 。
//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)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
。
对于这样的流程定义:
<task-node name="a"></task-node>
只有当节点中的三个任务都完成后,流程才进入后面的节点
对于这样的流程定义:
当第一个任务完成后,
token
就指向后面的节点
对于这样的流程定义:
<task-node name="a" signal="never"></task-node>
三个任务都完成后,
token
仍然不会指向后面的节点;需要自己手动调用
processInstance.signal()
才会驱动流程到下面的节点
。
对于这样的流程定义:
<task-node name="a" signal="unsynchronized"></task-node>
token
不会在本节点停留,而是直接到后面的节点
<task-node name="a"></task-node>
xml 代码
- < task-node name = 'a' >
- < task name = 'laundry' />
- < task name = 'dishes' />
- < task name = 'change nappy' />
- < transition to = 'b' />
- </ task-node >
对于这样的流程定义:
xml 代码
<transition to="b">
</transition>
- < task-node name = 'a' signal = 'first' > >
- < task name = 'laundry' />
- < task name = 'dishes' />
- < task name = 'change nappy' />
- < transition to = 'b' />
- </ task-node >
对于这样的流程定义:
<task-node name="a" signal="never"></task-node>
xml 代码
- < task-node name = 'a' signal = 'never' > >
- < task name = 'laundry' />
- < task name = 'dishes' />
- < task name = 'change nappy' />
- < transition to = 'b' />
- </ task-node >
对于这样的流程定义:
<task-node name="a" signal="unsynchronized"></task-node>
xml 代码
- < task-node name = 'a' signal = 'unsynchronized' > >
- < task name = 'laundry' />
- < task name = 'dishes' />
- < task name = 'change nappy' />
- < transition to = 'b' />
- </ task-node >
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" );
- }
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
(角色)。
评论
4 楼
dones
2008-07-29
不错,博主辛苦了。
3 楼
ppig
2007-12-17
介绍的很详细,而且深入浅出,对我对jpbm的理解很有帮助,谢谢你fndcz
上面这句话怎么有点耳熟,“。。。谢谢你,9527”
上面这句话怎么有点耳熟,“。。。谢谢你,9527”
2 楼
fndcz
2007-08-28
哦,是我漏掉了
已经补上了
已经补上了
1 楼
libin2722
2007-08-27
文章中提到的任务流转的图看不到啊!能不能再发一下,谢谢啊
发表评论
-
jBPM学习(八)----liferay4.2.2下的jBPM开发
2007-08-20 23:12 3730八、 liferay4.2.2 下的 jBPM 开发 ... -
jBPM学习(六)----Hello World
2007-08-20 23:06 11273六、 开发自己的工作流(Hello World) 1. ... -
jBPM学习(五)----面向图的程序设计
2007-08-20 23:04 4642五、 面向图的程序设计 Jbpm的流程设计语言是面向图的 ... -
jBPM学习(四)----体验jbpm
2007-08-20 23:03 3760四、 体验jbpm 进入jbpm主页面后,以 cookie ... -
jBPM学习(三)----将jbpm从jboss迁移到tomcat5.5
2007-08-20 22:50 5731<t description="builds ... -
jBPM学习(二)----数据库迁移
2007-08-20 22:49 6439二、 数据库迁移 1. 新 ... -
jBPM学习(一)----环境搭建
2007-08-20 22:47 11409初次接触jbpm, 下面是一些自己总结的东西,希望对大家有用 ...
相关推荐
"jbpm-jpdl-designer-3.1.3.zip" 是一个压缩包,其中包含的是JBPMP项目中的JPDL设计器的相关资源。这个版本号3.1.3表明这是一个特定的历史版本。JBPMP(Java Business Process Management Suite)是用于业务流程管理...
通过学习这些PPT,你将能够了解JBPM的工作原理,掌握流程设计、部署和监控的方法,同时也能了解其与外部系统的集成方式,从而在实际项目中有效地运用JBPM来优化和自动化业务流程。无论是初学者还是有经验的开发者,...
本篇文章将深入解析jBPM的1-6章测试代码,旨在帮助读者掌握jBPM的核心概念和实际操作。 1. **jBPM基本概念** - **流程定义**:jBPM通过BPMN 2.0模型来定义工作流程,包括任务、事件、决策等元素。 - **流程实例**...
6. **学习路径**:对于初学者,可以从阅读jBPM的官方文档开始,理解其架构和核心概念,如流程定义语言(BPMN)、工作流引擎、持久化机制等。然后,可以通过分析源代码加深理解,并尝试创建简单的流程示例来实践。 7. ...
**jbpm学习指南-初学者的宝典** JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于处理业务流程的建模、执行和监控。它由Red Hat公司维护,是企业级应用中进行流程自动化的重要工具。...
总结来说,这个资源包提供了一套全面的学习路径,从理论知识到实践案例,涵盖了jbpm的核心概念和与SSH框架的整合。对于希望掌握jbpm的开发者而言,这是一个宝贵的参考资料,可以帮助他们快速上手,并在实际项目中...
对于想要学习和使用jbpm的开发者来说,这是一个非常有价值的资源,可以帮助他们快速上手并深入理解工作流管理系统的概念和实践。通过深入研究和实践,开发者能够利用jbpm构建出高效、灵活且易于维护的业务流程应用。
jbpm-stru可能指的是jbpm的结构或者与其相关的整合,这可能意味着示例中包含了如何在Struts2中使用jbpm进行流程管理的代码或文档。jbpm-web-test则可能包含了一些关于如何在Web环境中测试jbpm流程的示例。 SSH是一...
- jbPM和Activiti的API和概念:如流程定义、流程实例、任务管理、事件监听器等。 - 集成jbPM/Activiti与Spring、Hibernate等Java框架的方法。 - MEAN全栈开发:了解MongoDB的数据模型,Express的路由和中间件,...
"JBPM用户指南.doc"文档是jbpm的重要参考资料,它详细介绍了如何使用jbpm进行流程设计、部署、执行以及相关的API使用方法。建议初学者首先阅读这份文档,理解jbpm的基本概念和操作,然后通过实际项目练习,掌握jbpm...
1. **jbpm概述**:解释jbpm的基本概念,包括工作流引擎、流程定义语言(JPDL)以及它在企业应用中的角色。 2. **安装与配置**:详述如何在开发环境中安装jbpm,包括设置环境变量、导入依赖库和配置数据库连接等步骤...
二、jBPM核心概念 1. 流程定义:使用BPMN 2.0语言编写,描述了业务流程的逻辑和步骤。 2. 实例(Process Instance):当流程定义被执行时,会产生一个实例,代表流程的实际运行状态。 3. 任务(Task):流程中的活动...
为了全面利用jbpm-4.4,开发者需要熟悉Java编程和相关的BPM概念,同时了解如何配置和部署jbpm环境。这可能涉及设置数据库连接、配置服务器、导入项目到IDE(如Eclipse)以及编写和部署流程定义。jbpm还提供了API和...
首先,我们要理解jbpm的核心概念。jbpm通过工作流定义语言(BPMN)来设计流程,这种语言允许开发者用图形化的方式描绘出业务流程的逻辑。在jbpm4.4中,它支持BPMN 2.0标准,这是一种广泛接受的业务流程建模规范,...
系统应支持对每个任务动态指派用户或用户组,JBPM提供了前后绑定用户的概念,即在设计时预设用户(前绑定)和在运行时动态指派用户(后绑定)。后绑定用户提供了更大的灵活性,便于流程的动态调整。 数据库设计方面...
### jBPM-4.3-jpdl 用户手册(中文)知识总结 #### 一、jBPM与jpdl概述 ...通过上述解析,我们可以了解到jBPM 4.3中关于流程定义及其组成部分的基本概念,这对于开发基于jBPM的应用程序是非常关键的基础知识。
本文将基于这份指南,深度剖析BPEL的核心概念、工作原理以及在JBoss jBPM环境下的应用实践。 ### 一、BPEL概述与行业背景 #### 服务导向架构(SOA) BPEL设计之初,即着眼于服务导向架构(SOA)。SOA是一种软件设计...
在jBPM中,每个任务都由一个`TaskInstance`表示,负责管理任务的状态以及与之相关的参与者信息。 **关键特性:** - **任务分配**:任务可以被分配给具体的参与者或用户组。 - **任务状态**:包括待办、进行中、已...
通过jBPM-jPDL学习笔记,你可以系统地学习如何使用jPDL设计和实施业务流程,掌握jbpm的核心概念和技术。无论是对于开发人员还是业务分析师,这份资料都将极大地提升你在工作流管理领域的专业技能。
jbpm-4.4是JBoss企业级工作流和业务自动化平台的一个版本,该平台主要用于构建和管理业务流程。在本压缩包“jbpm-4.4 part03.zip...在实际应用中,深入学习和理解这些概念,将有助于有效地利用jbpm构建和管理业务流程。