传智播客java学习--工作流初步_huangyu18_新浪博客

我今天预习了工作流的知识,我做了简单的笔记:

 

 

工作流(Workflow)

工作流就是工作流程的计算机化,即将工作流程中的工作如何前后组织在一起的

逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。

 

工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计

算机,按某种预定规则自动传递文档、信息或者任务。

 

通俗的说,就是多个人在一起合作完成某件事情。

 

** 工作流管理系统(Workflow Management System, WfMS)

主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执

行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系

统来实现。

 

工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功

能支持:A)定义工作流:包括具体的活动、规则等;B)运行控制功能:在运行

环境中管理工作流过程,对工作流过程中的活动进行调度;C)运行交互功能:指

在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。

 

** jBPM,全称是Java Business Process Management

是一种基于J2EE的轻量级工作流管理系统,jBPM是公开源代码项目

 

我们学习的版本为:3.2.2

 

OA(办公自动化)主要技术之一就是工作流。

 

* Jbpm的使用

 

** 使用步骤

- 编写流程定义(定义规则);

- 部署流程定义到系统中;

- 执行流程(使用指定的流程定义);

 

** 编写流程定义

 

以上流程由三个步骤组成,每个步骤即是一个任务,分别由一个角色执行。应该

使用jBPM提供的JPDL(jBPM Process Definition Language)来描述这个流程,

这样使用了jBPM的系统才能看的懂。

 

jPDL:是一种直观的流程语言,可以使用任务、等待状态、定时器、自动化动作

等等图形化地表示流程。jPDL认为一个商务流程可以被看作是一个UML状态图。

jPDL就是详细定义了这个状态图的每个部分,如起始、结束状态,状态之间的转

换等。(就是写一个xml文件)

 

用jPDL描述上面这个流程。

 

** 使用 jbpm 提供的 jbpm console web 应用程序测试/使用流程

jBPM Console web 是由 jBPM 提供的一个web应用。它是一个管理和监控流程的

控制台,用于检查和操纵运行的流程实例。

 

双击 server/start.bat 启动jbpm提供的jboss服务器,要访问地址为:

*********  http://localhost:8080/jbpm-console/

 

部署流程定义到 jbpm-console 中时的注意事项:A)要求流程定义文件的名字为

processdefinition.xml,并且在一个zip压缩文件的根目录中;B)存放流程定义

的zip文件所在的路径中不能含有中文(因为jbpm-console应用没有处理中文)。

 

部署流程定义后,就可以使用这个流程定义了(执行流程)。在开始一个流程后,

要先进入到 tokens 页面中点击 Signal 链接,这样才能使流程离开开始状态,

以后的步骤中都不需再做这个操作。当流程执行到有任务的节点时,就可以看到

当前节点中定义的任务了。任务的办理分为两步:开始和结束。

 

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

版本为1。

 

** 流程实例通过Token的维护当前正在执行的节点

Jbpm是怎么知道一个流程实例现在走到哪个节点了呢?每个流程实例都有一个指

针,指向当前正在执行的节点,在当前节点执行完后,到达了下一个节点,就是

让这个指针指向下一个节点。这个指针叫做Token(令牌)。

 

Token是运行时的概念,用来维护指向图结点的指针。Token需要一个信号

(signal)来让流程向前执行。当一个signal来到的时候,Token就会通过

transition离开当前的结点走到下一个结点。

 

** jBPM提供了一个图形化的流程设计器,是一个eclipse插件。

使用插件设计流程定义还可以生成图片,这样就可以实现流程的图形化监控。

 

使用插件设计完流程定义并保存后,会有三个文件:A)processdefinition.xml,

流程定义文件;B)processimage.jpg,流程图片;C)gpd.xml,保存流程图片中

的各个节点的坐标信息。

 

插件安装方法:在Eclipse安装目录下的links目录中新建一个文本文件,把扩展

名改为.link,并且修改内容为path=${插件中的eclipse文件夹所在的路径}。

 

** 使用插件时会遇到的几个问题

1,插件在eclipse3.3的版本上才能正常工作,所以myeclipse5.1(eclipse3.2)不

   能使用这个插件。

2,安装插时,如果 MyEclipse安装目录下的eclipse目录中没有links目录,可以

   手工创建一个。

3,还要注意指定的插件的路径中不能含有中文。

 

 

1,使用插件设计流程定义时,如果再点击插件下方的 "Source" 选项卡修改生成

   的processdefinition.xml,会出现突然少了一些内容或多出一些内容等情况,

   这是插件的问题。

2,如果想修改流程定义源文件,可以使用普通的xml编辑器打开进行修改,方法

   是在文件上点击右键 -> Open With -> MyEclipse XML Editor。

3,如果流程名称有中文或节点的名字中有中文,则生成的gpd.xml中的节点名字

   会出现乱码,这会导致不能正确的进行图形化监控。修正方法:在部署流程定

   义前把gpd.xml文件的编码改为GBK(改为本地编码,也要修改xml文件中的

   encoding的值为GBK)。要注意如果修改并保存了一下流程定义,就会重新生

   成processimage.jpg和gpd.xml文件,这时gpd.xml中的encoding又变成了

   UTF-8,应再改为GBK。(这是一个Bug)。

 

** 概念

流程定义(process definition):预先定义的业务流转逻辑。

 

流程实例(process instance):业务的一次实际流转过程。(是流程定义执行期

间的体现,包含了流程定义被解释之后的一些信息,诸如开始时间、结束时间和

其他相关联的信息)。

 

任务定义(task) ::

任务实例(task instance): 组成流程实例的元素。(Task被解释执行时的信息,

有创建时间、开始时间、结束时间、参与者等,有create、start、end 三种状态)。

 

* Jbpm的API

流程有关的所有信息都是要保存到数据库中的。jBPM的其中一个特色就是它使用

Hibernate来管理它的数据库。这样,jBPM就将数据的管理职能分离出去,自己则

专注于商务逻辑的处理。

 

** 1,准备环境:

A)添加jar包:

   jbpm-jpdl.jar(核心);

   jbpm-identity.jar(可选,组织机构);

   bsh.jar(BeanShell脚本);

   jboss-j2ee.jar;

 

   hibernate3.jar(Hibernate);

   antlr-2.7.6.jar(Hibernate);

   asm.jar(Hibernate);

   cglib.jar(Hibernate);

   dom4j.jar(Hibernate);

   commons-collections.jar(Hibernate);

   commons-logging.jar(Hibernate);

 

   hsqldb.jar(可选,纯Java写的数据库);

   log4j.jar(可选,日志记录);

 

   Junit4(单元测试);

 

B)添加配置文件(在jbpm-jpdl-3.2.2/config目录中):

   jbpm.cfg.xml;

   hibernate.cfg.xml;

   log4j.properties(可选,log4j配置文件);

 

C)修改数据库库连接信息,如果使用的不是HsqlDB数据库,还应添加相应的

   jdbc驱动。生成数据库表。

 

** 编写流程定义

员工报销,由其经理审批。审批通过后,此员工到财务去领款,流程结束;如果

未经理审批通过,流程结束。经理在审批的时候应能看到这个员工要报销的金额,

根据金额做出是否通过的决定。

 

** 2,编程步骤,要实现的功能有:

    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有一个明智的流程版本机制。版本

机制允许在数据库中多个同名流程定义共存,流程实例以当时的{zx1}版本来启动,

并且在它的整个生命周期中将保持以相同的流程定义执行。当一个新的版本被部

署,新的流程实例以新版本启动,而老的流程实例则以老的流程定义继续执行。

 

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

在,则版本为1。

 

在部署到jBPM数据库之后改变流程定义有很多潜在的缺陷,因此非常不鼓励这样

做。可以直接部署为一个新的版本。

 

** 执行流程

流程实例可以通过ProcessDefinition.createProcessInstance()方法创建,或者

是使用new ProcessInstance(ProcessDefinition pd)并传递一个流程定义来创建,

总之创建的流程实例一定是要是属于(使用)某个流程定义的。启动流程后不要

忘了使用ProcessInstance.signal()方法离开开始状态。

 

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

不是流程定义文件的名字!

 

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

 

开始任务的方法为:TaskInstance.start();结束任务为:TaskInstance.end(),

TaskInstance.end(String transitionName);无参的end()方法是使用{dy}个

transition离开节点;第二个方法是指定完成任务后使用指定的transition离开

节点。一个任务实例只能开始和结束一次(再次开始或结束会抛异常)。

 

在员工填写报销单任务完成前,应把业务数据"报销金额"与流程关联起来,可以

通过设置流程变量实现。流程变量是与流程实例关联的,并且会持久化到数据库

中。不同的流程实例是互不相干的,就好比web中的session,在其中设置变量

(setAttribute)是跟其它的session中的变量无关的。

 

利用变量动态的设置参与者。在流程定义中指定参与者(actor-id)时,可以使

用变量,变量是以"#{"开头,以"}"结束,中间的是变量名。这里的变量引用的是

在执行流程时设置的流程变量。

 

 

流程实例有了结束时间(end!=null)就表示这个流程实例结束了。任务实例如果开

始时间不为null(start!=null),表示已经开始了,即已对其调用了start()方法;

同样在调用任务实例的end()方法时,结束时间被填充(end!=null表示任务实例

已结束)。

 

 

* 流程图

流程图是由node(节点)和transition(转换)组成的。每个节点都有一个类型。

每个节点(除end-state外)有1个或多个transition(转换)。每个transition

都应该有一个名字,但这不是强制性的。当transition只有一个时,可以不指定

名字,也不会有问题;但是多于1个时,应使用不同的名字来区分,以便在使用时

能够指定(区分)要使用那一个。

 

不管一个节点有几个transition,都只会使用其中一个离开此节点。transition

离开节点,是使用方法TaskInstance.end(String transitionName)。

 

如果离开节点时没有指定要使用哪个transition,则使用默认的那一个,默认的

是定义中的{dy}个;如果有多个transition有相同的同字,并且指定指定使用这

个名字的transition离开节点时,被使用的将是指定的名字transition列表中的

{dy}个。当然,这个情况,我们都应避免出现(为不同的transition 指定不同的

名字即可)。

 

* 变量

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

 

** 流程变量

变量的访问和赋值是在某一个token上进行的,缺省时,是基于root Token。

变量名的类型为java.lang.String, 支持的变量值类型参见文档10.1节。

(如果变量值是PO,则PO的id应为long型)。

 

每个Token(执行路线)有它自己的一套流程变量。变量的作用域和所属的Token

的生命周期一致,不同的Token上的同名变量互不影响。

郑重声明:资讯 【传智播客java学习--工作流初步_huangyu18_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——