jBPM4的一些相关概念
jBPM4的一些相关概念(转)
首先,在jBPM4中,流程定义相关的布署信息就存储在JBPM4_DEPLOYMENT、JBPM4_DEPLOYPROP及JBPM4_LOB中。
其次,虽然jBPM也说一个流程定义是关于某个过程(Procedure)中的各个步骤(Step)的描述,但在流程定义中并未出现Step字样,而是代之于Activity。顾名思义,在JBPM4_HIST_PROCINST与JBPM4_HIST_ACTINST两张表中,分别存放的是Process Instance、Activity Instance的历史记录(实际上对于流程实例而言,一经建立,就会被存放在JBPM4_HIST_PROCINST中了)。而这两张History表,也是jBPM升级至V4才有的,算是V4的亮点之一!
存放Process Instance、Activity Instance历史记录的表有了,那他们的当前记录存在什么地方呢?这就需要弄清楚jBPM的另外几个概念。一般而言,在jBPM中,“a process instance is the root of a tree of executions”。因此,当一个流程实例Split出两个并行步骤的时候(这里的描述语言用的是OSWorkflow的,见谅),在JBPM4_EXECUTION表中将有三笔相关记录,一笔是代表流程实例的Root Execution,另外两笔是关于上述两个并行步骤的Child Execution。
此外,我们还必须搞清楚,在jBPM中,Activity的种类是很丰富的,可以是Control Flow Activities,如sub-process、decision等,也可以是Automatic Activities,如java、script、sql等(有关activity的完整描述请参见jPDL文档)。其中需要人来参与完成的Activity被称为Task,相关记录被存放于JBPM4_TASK表中。
对一个Task而言,它可能会有多个Participation(Swim Lane同样会有多个Participation)。Participation的种类有Candidate、Client、Owner、Replaced Assignee和Viewer。而具体的Participation既可以是单一用户,也可以是用户组。Participation的信息存放在JBPM4_PARTICIPATION表中。
Swim Lane是一种Runtime Process Role。通过Swim Lane,多个Task可以一次分配到同一Actor身上。存放这些信息是表JBPM4_SWIMLANE。
除此以外,JBPM4_JOB存放的是Timer的定义,JBPM4_VARIABLE存的是临时变量,JBPM4_COMMENT中的是用户在Task上的加注信息。
jBPM4中的任务分配
在前一篇笔记中,我们提到过,jBPM到V4后增加了两张新表——JBPM4_HIST_PROCINST、JBPM4_HIST_ACTINST,用来存放Process、Activity实例的历史记录。
与OSWorkflow相比,jBPM还有一个特别——有一张表专门用来存放需要人参与完成的Activity,在V4中,这张表名为JBPM4_TASK。显而易见,在一个流程中,只有需要人参与完成的Activity才有Assignment之说,而且因为他们只是全部Activity的一个子集,所以在构建有关的个人、用户组任务项列表时,数据库查询所涉及的记录数要少于OSWorkflow。
至于jBPM中的Swimlane——
它是随流程一起被定义的,所以也随流程一道被实例化。同一流程定义下的各个流程实例(Process Instance),分别拥有自己的Swimlane实例,在JBPM4_SWIMLANE表中也是有各自的记录与其对应;对一个Swimlane Instance的操作不会影响到另一个,即使它们来自同一个流程定义。
Swimlane的Candidate属性会传播到与之相关联的Task实例上。即,与Swimlane相关联的Task实例会自动获得Swimlane的Candidate属性;并且,在数据库表JBPM4_PARTICIPATION中,会有生各自的记录,分别保存Swimlane Instance与Task Instance的Candidate。
对Task Instance的assignment操作,将会传播到与之关联的Task Instance之上。换言之,假如我们将一个Task Instance分配给用户A,而这个Task Instance又属于某个Swinlane Instance B,则从此Swinlane Instance B就被指派给用户A了;进而,Swimlane Instance中的其他Task Instance也顺势被指派给了用户A。
不知通过上面的描述,是不是能让我们进一步理解“A swimlane is a process role.”这句话呢?好象它的作用就在于将一个Process Instance中的多个Task一次分配给同一个Actor吧。