随笔-54  评论-0  文章-2  trackbacks-0

   今天是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 阅读(254) 评论(0)  编辑  收藏