JBPM的介绍

编程步骤,要实现的功能有:
    a> 部署流程定义。
    b> 启动流程。
    c> 获取任务列表。
    d> 开始任务。
    e> 结束任务。

其中编写流程定义和步骤a是添加流程定义到系统中;步骤b,c,d,e是使用系统中
存在的某个流程定义执行流程;步骤c,d,e是办理一个任务的过程,流程的执行就
是一次次办理任务的过程。

 


有两个重要的类:JbpmConfiguration和JbpmContext。JbpmConfiguration是
jBPM的相关配置信息,并有创建JbpmContext的功能,可以把JbpmConfiguration
想像成Hibernate中的Configuration与SessionFactory的结合体。使用
JbpmConfiguration.getInstance()方法创建一个JbpmConfiguration对象,这会
使用默认的jbpm配置文件:在classpath根目录中,并且名字为jbpm.cfg.xml。或
者是使用getInstance(String configFilePath)方法,用指定的配置文件构造。

Jbpm中几乎所有的操作都是通过JbpmContext完成的,可以把他想像成Hibernate
中的Session。他是通过JbpmConfiguration.createJbpmContext()方法创建的,
JbpmContext中包装有一个Hibernate的Session(通过他做的数据库操作)。使用
完JbpmContext后一定要调用他的close()方法,否则所有信息都不会持久化到数
据库当中。因为在调用JbpmConfiguration.createJbpmContext()方法时会创建一
个Hibernate的Session并开始事务;在调用JbpmContext.close()方法时会提交事
务并且关闭所关联的Session。如果在执行JbpmContext.close()之前调用方法
jbpmContext.setRollbackOnly(),则在JbpmContext.close()时会回滚事务。

 

** 部署流程定义
这个过程就是把流程定义的相关信息保存到jBPM的数据库中。

解析流程定义有三种方式(ProcessDefinition的静态方法):
1)解析xml文件:parseXmlResource或parseXmlInputStream和parseXmlReader;
2)是解析xml字符串:parseXmlString;
3)解析par包:parseParResource与parseParZipInputStream。

ProcessDefinition.parseXmlResource(xmlResource)接受的参数是流程定义文件
的路径,这个路径是相对于classpath的根路径的一个相对路径。

Process archive(par),流程档案文件,是一个zip文件。必须要有一个流程定
义文件,名字为processdefinition.xml,流程档案也可以包含其他的相关文件,
如processimage.jpg,gpd.xml或classes(类的字节码文件夹)等等,(流程定义
中使用到的class要放到classpath中;或者是放到流程档案的/classes文件夹中,
这样就会被流程类装载器来装载)。

流程定义不应该改变,因为预测流程变化带来的所有可能的影响是非常困难的
(或者说是不可能的)。围绕这个问题,jBPM有一个明智的流程版本机制。版本
机制允许在数据库中多个同名流程定义共存,流程实例以当时的最新版本来启动,
并且在它的整个生命周期中将保持以相同的流程定义执行。当一个新的版本被部
署,新的流程实例以新版本启动,而老的流程实例则以老的流程定义继续执行。

部署流程定义时,如果存在同名的流程定义,则版本自动累加(加1);如果不存
在,则版本为1。

在部署到jBPM数据库之后改变流程定义有很多潜在的缺陷,因此非常不鼓励这样
做。可以直接部署为一个新的版本。

 

** 执行流程
流程实例可以通过ProcessDefinition.createProcessInstance()方法创建,或者
是使用new ProcessInstance(ProcessDefinition pd)并传递一个流程定义来创建,
总之创建的流程实例一定是要是属于(使用)某个流程定义的。启动流程后不要
忘了使用ProcessInstance.signal()方法离开开始状态。

注意:流程定义的名字是processdefinition.xml文件中的根元素的name属性的值,
不是流程定义文件的名字!

 

任务列表:当前需要办理(未完成)的任务集合。可以通过TaskMgmtSession获得。

开始任务的方法为:TaskInstance.start();结束任务为:TaskInstance.end(),
TaskInstance.end(String transitionName);无参的end()方法是使用第一个
transition离开节点;第二个方法是指定完成任务后使用指定的transition离开
节点。一个任务实例只能开始和结束一次(再次开始或结束会抛异常)。

在员工填写报销单任务完成前,应把业务数据"报销金额"与流程关联起来,可以
通过设置流程变量实现。流程变量是与流程实例关联的,并且会持久化到数据库
中。不同的流程实例是互不相干的,就好比web中的session,在其中设置变量
(setAttribute)是跟其它的session中的变量无关的。

利用变量动态的设置参与者。在流程定义中指定参与者(actor-id)时,可以使
用变量,变量是以"#{"开头,以"}"结束,中间的是变量名。这里的变量引用的是
在执行流程时设置的流程变量。


流程实例有了结束时间(end!=null)就表示这个流程实例结束了。任务实例如果开
始时间不为null(start!=null),表示已经开始了,即已对其调用了start()方法;
同样在调用任务实例的end()方法时,结束时间被填充(end!=null表示任务实例
已结束)。

以下是一些实体与表的对应关系:
+-------------------+----------------------+-----------
|        PO         |        table         |   实体
+-------------------+----------------------+-----------
|ProcessDefinition  |jbpm_processdefinition|  流程定义
+-------------------+----------------------+-----------
|ProcessInstance    |jbpm_processinstance  |  流程实例
+-------------------+----------------------+-----------
|TaskInstance       |jbpm_taskinstance     |  任务实例
+-------------------+----------------------+-----------
|VariableInstance   |jbpm_variableinstance |  流程变量
+-------------------+----------------------+-----------

 

* 流程图
流程图是由node(节点)和transition(转换)组成的。每个节点都有一个类型。
每个节点(除end-state外)有1个或多个transition(转换)。每个transition
都应该有一个名字,但这不是强制性的。当transition只有一个时,可以不指定
名字,也不会有问题;但是多于1个时,应使用不同的名字来区分,以便在使用时
能够指定(区分)要使用那一个。

不管一个节点有几个transition,都只会使用其中一个离开此节点。transition
离开节点,是使用方法TaskInstance.end(String transitionName)。

如果离开节点时没有指定要使用哪个transition,则使用默认的那一个,默认的
是定义中的第一个;如果有多个transition有相同的同字,并且指定指定使用这
个名字的transition离开节点时,被使用的将是指定的名字transition列表中的
第一个。当然,这个情况,我们都应避免出现(为不同的transition 指定不同的
名字即可)。

 

* 变量
org.jbpm.context.exe.ContextInstance是提供流程变量服务的中央接口。

变量分为两种:流程变量和临时变量。流程变量会被持久化到数据库中;临时变
量则不会(只是在放到内存中)。

 

** 流程变量
变量的访问和赋值是在某一个token上进行的,缺省时,是基于root Token。
变量名的类型为java.lang.String, 支持的变量值类型参见文档10.1节。
(如果变量值是PO,则PO的id应为long型)。

每个Token(执行路线)有它自己的一套流程变量。变量的作用域和所属的Token
的生命周期一致,不同的Token上的同名变量互不影响。

 

** 临时变量
临时变量的值允许使用任何类型,并且临时变量同Token无关。

 

 


* Jbpm的持久化API
Jbpm中所有数据库操作的入口都是JbpmContext,这是最核心的一个类。各种的数
据库操作,JbpmContext都会委派给不同的Session(例如GraphSession,
TaskMgmtSession等)来处理。

 

** GraphSession
与流程图有关的数据库操作,如对流程定义和流程实例的增、删、查等操作。

 

** TaskMgmtSession 与任务实例有关的数据库操作,主要是任务实例的查询。

 

** ContextInstance
操作变量的类,可以添加或移除流程变量或临时变量,变量是就一个跟流程相关
联的key-value对。常用方法有setVariable(String key, Object value)与
getVariable(String key)。

 

* TaskMgmtInstance
主要是管理任务实例(TaskInstance)与角色(Swimlane)的。

你可能感兴趣的:(编程,Hibernate,xml,配置管理,jbpm)