社区
JBoss技术交流
帖子详情
JBPM 中的 ProcessInstance、Execution、Task是什么关系呀?
xiaojiit
2012-04-07 04:05:13
JBPM 中的 ProcessInstance、Execution、Task是什么关系呀?
在使用中,发现ProcessInstance 的ID 与Execution ID相同,
并可以可以使用ProcessInstance ID查询出Execution,这是什么关系?
...全文
294
3
打赏
收藏
JBPM 中的 ProcessInstance、Execution、Task是什么关系呀?
JBPM 中的 ProcessInstance、Execution、Task是什么关系呀? 在使用中,发现ProcessInstance 的ID 与Execution ID相同, 并可以可以使用ProcessInstance ID查询出Execution,这是什么关系?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
片刻小哥哥
2013-09-17
打赏
举报
回复
http://zybing.iteye.com/blog/746088 别人写的挺好的
zero_and_zero
2012-06-18
打赏
举报
回复
哈哈 看api
与表结构 会更明白的
惊蛰夕雨
2012-04-07
打赏
举报
回复
看官网文档
JBPM
4
中
Process
Definition、
Process
Instance
、
Execution
、
Task
关系
和区别
BPM4
中
Process
Definition、
Process
Instance
、
Execution
、
Task
关系
和区别
jbpm
安装及使用方法
1.JPDL的流程定义元素 1)第一层:GraphElement 这个容易理解,因为在画流程定义时,每个拖拉的对象都是一个graph的元素。GraphElement有四个属性: (1)
process
Define 表示当前元素属于哪个流程定义 (2)events 表示可以接收哪些event (3)name 名字 (4)exceptionHandlers 异常处理类集合(List) 2)第二层:node、
process
Definition、Transition、
Task
它们都继承自GraphElement (1)
process
Definition表示流程定义(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、
Process
State、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
Process
Instance
pi = new
Process
Instance
( 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(
process
Definition.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里
execution
Context.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
instance
s 创建后,
task
-node就处于等待状态。当所有的
task
instance
s被特定的user执行完毕后,将会发出一个新的signal 到token,即流程继续执行。 2)state state是一个纯粹的wait state(等待状态)。它和
task
-node的区别就是它不会创建
task
instance
s。很典型的用法是,当进入这个节点时(通过绑定一个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节点会处于等待状态,直到所有的任务被执行完毕。任务的名称在整个流程
中
必须是唯一的。一个
Task
Node对应多个
Task
。 对于这样的流程定义: xml 代码 1. <
task
-node name='a'> 2. <
task
name='laundry' /> 3. <
task
name='dishes' /> 4. <
task
name='change nappy' /> 5.
6.
task
-node> 只有当节点
中
的三个任务都完成后,流程才进入后面的节点 对于这样的流程定义: xml 代码 1. <
task
-node name='a' signal='first'>> 2. <
task
name='laundry' /> 3. <
task
name='dishes' /> 4. <
task
name='change nappy' /> 5.
6.
task
-node> 当第一个任务完成后,token就指向后面的节点 对于这样的流程定义: xml 代码 1. <
task
-node name='a' signal='never'>> 2. <
task
name='laundry' /> 3. <
task
name='dishes' /> 4. <
task
name='change nappy' /> 5.
6.
task
-node> 三个任务都完成后,token仍然不会指向后面的节点;需要自己手动调用
process
Instance
.signal()才会驱动流程到下面的节点。 对于这样的流程定义: xml 代码 1. <
task
-node name='a' signal='unsynchronized'>> 2. <
task
name='laundry' /> 3. <
task
name='dishes' /> 4. <
task
name='change nappy' /> 5.
6.
task
-node> token不会在本节点停留,而是直接到后面的节点 12.
jbpm
的任务管理实现 一个
Task
instance
(任务实例)可以被分配给一个actorId (java.lang.String)。所有的
Task
instance
都被保存在数据库
中
的表
jbpm
_
task
instance
里。当你想得到特定用户的任务清单时,你就可以通过一个与用户关联的actorId来查询这张表。 一个流程定义有一个
Task
MgmtDefinition;一个
Task
MgmtDefinition对应多个swimlane,同时对应多个
task
;一个swimlane有多个
task
,可以从
Task
MgmtDefinition
中
通过
task
的名称直接获取相应的
task
; swimlane对象有四个属性,分别是name(名字)、assignmentDelegation(分配代理类)、
task
MgmtDefinition、
task
s(Set 对应多个
task
),可以增加
task
task
对象主要的属性:
task
MgmtDefinition、swimlane、assignmentDelegation、
task
Node,需要注意的是swimlane和assignmentDelegation
中
间只是可以一个属性有值,因为它们都和任务的分配有
关系
。 一个流程实例有一个
Task
Mgmt
Instance
;一个
Task
Mgmt
Instance
对应多个swimlane
Instance
,同时对应多个
task
Instance
;一个swimlane
Instance
有多个
task
Instance
,可以从
Task
Mgmt
Instance
中
直接获取相应的
task
Instance
; swimlane
Instance
对象主要有五个属性,分别是name、actorId、pooledActors(Set)、swimlane、
task
Mgmt
Instance
。
task
Instance
对象的主要属性:name、actorId、
task
、swimlane
Instance
、
task
Mgmt
Instance
、pooledActors。 当对任务进行分配时,一般需要实现AssignmentHandler这个接口,这个接口的方法只有一个: void assign( Assignable assignable,
Execution
Context
execution
Context) throws Exception; 一个典型的实现(把名字是'change nappy'的任务交给NappyAssignmentHandler这个类来分配) xml 代码 1. <
task
name='change nappy'> 2.
3.
task
> NappyAssignmentHandler类: java 代码 1. public void assign(Assignable assignable,
Execution
Context
execution
Context) { 2. assignable.setActorId("papa"); 3. } 同样,Assignable只是一个接口,它有两个方法:setActorId()和setPooledActors(),Assignable的具体实现类也是两个:swimlane
Instance
he和
task
Instance
。这样就不不难理解整个任务分配流程了: 1、流程进入
Task
Node节点,执行
Task
Node类的execute()方法,该方法首先获得
Task
Mgmt
Instance
实例,然后通过它来创建
Task
Instance
。
task
Mgmt
Instance
.create
Task
Instance
(
task
,
execution
Context); 2、在上面的create
Task
Instance
(
task
,
execution
Context)里,该方法调用了
task
Instance
.assign(
execution
Context)对
task
Instance
进行分配。 3、在assign(
execution
Context)方法里,首先会判断
task
属性里是否存在swimlane,如果有的话,这个
task
Instance
就会分配给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
4.3 pvm的使用
在
jbpm
4.3
中
如何取得Dbsession,
Task
Impl等,关于pvm的使用 目前不是很明白dbsession,
task
impl的含义。初学者。
jbpm
3.2.3 源码
jbpm
源码 src source 111111111111111111
jbpm
4.4 学习笔记
最近通过使用
jbpm
,学习了一下,自己整理的一份
jbpm
的学习笔记,,希望对你们有帮助
JBoss技术交流
6,787
社区成员
2,557
社区内容
发帖
与我相关
我的任务
JBoss技术交流
JBoss技术交流
复制链接
扫一扫
分享
社区描述
JBoss技术交流
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章