今天是jBPM的第二天,内容不多,定义不少,主要讲了流程变量,节点和事件等知识,全是新的知识,刚学肯定生疏,久了就没问题了,编程嘛,多敲代码,多
调试,才是王道。
1. 流程变量
通过org.jbpm.context.exe.ContextInstance来操
作变量。
2.变量的生命周期
变量的访问和赋值是在某一个token上进行的,缺省时,是基于root
Token。每个Token(执行路线)有它自己的一套流程变量。变量的作用域和所属的Token的生命周期一致,不同的Token上的同名变量互不影
响。
3.变量值要求
变量名的类型为java.lang.String,支持的变量值类型如下(文档10.1节)。(
如
果变量值是classes that are persistable with
hibernate,则POJO的id应为long型或String型。
saveOrUpdate( po );
savePoIdAndPoClassAsVariable()
session.get(
class, id )
节点
1.
流程图中的各种节点的作用及用法
为什么需要多种节点类型?
需要有不同类型(作用)的节点,才能设计出复杂的流程图。
Jbpm有一套预先定义好的节点类型。如果不够用,也可以使用自定义节点进行扩展,以完成不同的流程的需要。
不同的节点类型代表不同的行
为。
每个流程都必须要有开始节点和结束节点。
2.预定义节点
start-state,开始节点:标识流
程开始、
end-state,结束节点:标识流程结束、
task-node,任务节点:可以放0个或多个任务、
decision,
决策节点:路径选择,只使用一个流转(叉路口)、
fork/join,分支节点/合并节点:可以分为多个并行执行的分支、
state,状
态节点:等待。
每个节点都对应一个类(Jbpm的持久化类),都是org.jbpm.graph.def.Node的子类。节点
都有名字、流转(end-state除外)。
event事件
事
件。
1, 有几种事件,分别在什么时候触发
2, 怎么指定当事件触发时做什么事(Action)
1, 节点的事件
a)
进入节点(node-enter)。(开始节点没有)
b) 离开节点(node-leave)。(结束节点没有)
2,
流转的事件
a) 只有一个:使用流转(take a transition)
3, 任务的事件
a)
创建任务(task-create)
b) 分配任务(task-assign)
c)
开始任务(task-start)à TaskInstance.start()
d) 结束任务(task-end)à
TaskInstance.end()
每个事件有一个动作(action)清单。当jBPM引擎产生一个事件,动作(action)清单就会被
执行. 不同的节点支持的事件类型不同,是由event元素所在的节点的类型决定的,例如transition只有一个事件。
可以在event元
素用可以指定一个动作,当指定的事件发生时,这个动作被执行。
可以给同一个事件指定多个动作,当这个事件触发的时候,这些动作执行的顺序
和定义先后顺序是一致的。
不同元素支持不同的事件类型:
一般的节点都具有的事件:node-enter,进入节点、
node-leave,离开节点;
start-state只有node-leave;
end-state只有node-enter;
transition
只有一个执行转换的事件(taking a transition)。因为只有一个事件,所以配置时不用写event元素,而直接配置Action。
task
有task-create,任务创建、task-assign,任务分配、task-start,任务开始、task-end,任务结束。
关
于哪些元素支持哪些事件,可以通过文档的18.4节中的xml文件的写法中获得。
如果配置的事件类型不存在,不会报错,也不会执行。
注
意:在事件中定义的动作(Action)不应该(不能)影响流程的执行。即不要在事件的动作中给token发信号,否则会抛异常:token is
locked。(在Node中配置的Action可以给Token发信号。)
事件执行的顺序:
已触发事件:node-leave
已触发事件:transition
已
触发事件:node-enter
已触发事件:task-create
已触发事件:task-assign
已
触发事件:task-start
已触发事件:task-end
*************************
动态的创建不确定数量的任务实例 *********
会签。
实现任务分配给多个人,在流程定义中定义的相
应的任务,不指定参与者,也不知道指定为谁。需要做以下工作:
1,
阻止jBPM自动创建任务实例(设置task-node的create-tasks="false")
2,
在node-enter事件中定义一个动作指定用于创建TaskInstance的类。
类
CreateTaskInstancesAction要接管两个操作:创建与分配任务实例。
创建任务实例要调用方法:
TaskMgmtInstance.createTaskInstance(Task, ExecutionContext);
其中的
Task 是任务的定义,可以先得到当前的节点:
TaskNode taskNode = (TaskNode)
executionContext.getNode();
然后通过任务的名字得到任务的定义:
Task task =
taskNode.getTask("审批");
任务分配
个人任务:actor-id=”xxx”
查询组任务列表的方法为:
TaskMgmtSession.findPooledTaskInstances(String
actorId)
对于一个组任务,如果他的actorId为null,组中所
有的用户都可以在组任务列表中看到这个任务。如果使用TaskInstance.setActorId(String)方法设置这个任务由指定的
acrorId来办理,这时pooledActors中的其他人就看不到这个任务了,就是说actorId会屏蔽pooledActors;
当这个用户因某些原因不能办理任务时,可以把这个任务再退回到组任务列表中,方法是调用TaskInstance.setActorId(null)设置
actorId为null,这时pooledActors中的所有人又都可以看到这个任务了。
不管使用哪种方式分配任务,参与者
(Actor-id,字符串类型)的计算(确定)都是由业务层负责解释的。
最后汤兄给我们推荐了一些好书,学习java必须准备三样: 心态,基础,睡觉。能学多少学多少。明天才是OA工作流项目的开始!加油。。。
posted on 2010-02-01 21:59
d66380022 阅读(259)
评论(0) 编辑 收藏