BPM业务流程管理jbpm工作流全程笔记.docx

上传人:b****2 文档编号:24213165 上传时间:2023-05-25 格式:DOCX 页数:27 大小:106.87KB
下载 相关 举报
BPM业务流程管理jbpm工作流全程笔记.docx_第1页
第1页 / 共27页
BPM业务流程管理jbpm工作流全程笔记.docx_第2页
第2页 / 共27页
BPM业务流程管理jbpm工作流全程笔记.docx_第3页
第3页 / 共27页
BPM业务流程管理jbpm工作流全程笔记.docx_第4页
第4页 / 共27页
BPM业务流程管理jbpm工作流全程笔记.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

BPM业务流程管理jbpm工作流全程笔记.docx

《BPM业务流程管理jbpm工作流全程笔记.docx》由会员分享,可在线阅读,更多相关《BPM业务流程管理jbpm工作流全程笔记.docx(27页珍藏版)》请在冰豆网上搜索。

BPM业务流程管理jbpm工作流全程笔记.docx

BPM业务流程管理jbpm工作流全程笔记

(BPM业务流程管理)jbpm工作流全程笔记

1.工作流

<1>工作流(Workflow):

就是自动运作的业务过程部分或整体,表现为参与者对文件、信息或任务按照规程采取行动,并令其在参与者之间传递。

简单地说,工作流就是一系列相互衔接、自动进行的业务活动或任务。

工作流是针对工作中具有固定程序的常规活动而提出的一个概念。

通过将工作活动分解成定义良好的任务、角色、规则和过程来进行执行和监控,达到提高生产组织水平和工作效率的目的。

<2>工作流就是工作流程的计算机化,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。

工作流要解决的主要问题是:

为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。

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

<4>工作流可实现业务或公文的申请、审批、会签、登记、操作等环节的管理,可将工作过程进行记录,便于日后检查。

并实现数据的规范化录入、查询、统计和存档。

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

2.工作流管理系统(WorkflowManagementSystem,WfMS)

<1>主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。

工作流需要依靠工作流管理系统来实现。

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

①定义工作流:

包括具体的活动、规则等;

②运行控制功能:

在运行环境中管理工作流过程,对工作流过程中的活动进行调度;

③运行交互功能:

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

3.JBPM,全称是JavaBusinessProcessManagement

<1>JBPM是一种基于J2EE的轻量级工作流管理系统,jBPM是公开源代码项目,官方主页为:

http:

///jbossjbpm

<2>Jbpm的使用

**步骤

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

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

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

①编写流程定义

举例:

员工报销费用的流程描述:

员工需要先填写报销单据;交给其经理进行审批;审批(通过)后到财务去领款。

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

应该使用jBPM提供的JPDL(jBPMProcessDefinitionLanguage)来描述这个流程,这样使用了jBPM的系统才能看的懂。

jPDL:

是一种直观的流程语言,可以使用任务、等待状态、定时器、自动化动作等等图形化地表示流程。

jPDL认为一个商务流程可以被看作是一个UML状态图。

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

换等。

(就是写一个xml文件)

②使用jbpm提供的jbpmconsoleweb应用程序测试/使用流程

jBPMConsoleweb是由jBPM提供的一个web应用。

它是一个管理和监控流程的控制台,用于检查和操纵运行的流程实例。

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

http:

//localhost:

8080/jbpm-console/

部署流程定义到jbpm-console中时的注意事项:

A)要求流程定义文件的名字为processdefinition.xml,并且在一个zip压缩文件的根目录中;

B)存放流程定义的zip文件所在的路径中不能含有中文(因为jbpm-console应用没有处理中文)。

③执行流程

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

在开始一个流程后,要先进入到tokens页面中点击Signal链接,这样才能使流程离开开始状态,以后的步骤中都不需再做这个操作。

当流程执行到有任务的节点时,就可以看到当前节点中定义的任务了。

任务的办理分为两步:

开始和结束。

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

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

每个流程实例都有一个指针,指向当前正在执行的节点,在当前节点执行完后,到达了下一个节点,就是让这个指针指向下一个节点。

这个指针叫做Token(也叫做令牌)。

Token是运行时的概念,用来维护指向图结点的指针。

Token需要一个信号(signal)来让流程向前执行。

当一个signal来到的时候,Token就会通过transition离开当前的结点走到下一个结点。

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

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

<2>使用插件设计完流程定义并保存后,会有三个文件:

A)processdefinition.xml,流程定义文件;B)processimage.jpg,流程图片;C)gpd.xml,保存流程图片中的各个节点的坐标信息。

<3>插件安装方法:

在Eclipse安装目录下的links目录中新建一个文本文件,把扩展名改为.link,并且修改内容为path=${插件中的eclipse文件夹所在的路径}。

<4>使用插件时会遇到的几个问题

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

②安装插时,如果Myseclipse安装目录下的eclipse目录中没有links目录,可以手工创建一个。

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

③使用插件设计流程定义时,如果再点击插件下方的"Source"选项卡修改生成的processdefinition.xml,会出现突然少了一些内容或多出一些内容等情况,这是插件的问题。

如果想修改流程定义源文件,可以使用普通的xml编辑器打开进行修改,方法是在文件上点击右键->OpenWith->MyEclipseXMLEditor。

④如果节点的名字中有中文,则生成的gpd.xml中的节点名字会出现乱码,这会导致不能正确的进行图形化监控。

修正方法:

在部署流程定义前把gpd.xml文件的编码改为GBK(改为本地编码,也要修改xml文件中的encoding的值为GBK)。

要注意如果修改并保存了一下流程定义,就会重新生成processimage.jpg和gpd.xml文件,这时gpd.xml中的encoding又变成了UTF-8,应再改为GBK。

(这是一个Bug)。

今天,在课堂上,汤阳光老师教我们大家熟悉了Jbpm,并实现了一个简单的办公流程事例,以下是课堂总结和相关实现代码。

1.概念

<1>流程定义:

预先定义的业务流转逻辑。

<2>流程实例(processinstance):

业务的一次实际流转过程。

(是流程定义执行期间的体现,包含了流程定义被解释之后的一些信息,诸如开始时间、结束时间和其他相关联的信息)。

<3>任务实例(taskinstance):

组成流程实例的元素。

(Task被解释执行时的信息,

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

2.搭建环境:

*Jbpm的API:

流程有关的所有信息都是要保存到数据库中的。

jBPM的其中一个特色就是它使用Hibernate来管理它的数据库。

这样,jBPM就将数据的管理职能分离出去,自己则专注于商务逻辑的处理。

<1>添加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(单元测试);

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

jbpm.cfg.xml;

hibernate.cfg.xml;

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

修改数据库库连接信息,如果使用的不是HsqlDB数据库,还应添加相应的jdbc驱动。

我们选用mysql数据库驱动mysql-connector-java-5.1.7-bin.jar。

<3>生成数据库表。

选用单元测试的方式生成数据库表,以下是测试类代码:

publicvoidcreateSchema(){

//读取配置文件并创建数据库

newConfiguration().configure().buildSessionFactory();

}

3.编写流程定义

员工报销,由其经理审批。

审批通过后,此员工到财务去领款,流程结束;如果

未经理审批通过,流程结束。

经理在审批的时候应能看到这个员工要报销的金额,

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

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

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(StringconfigFilePath)方法,用指定的配置文件构造。

Jbpm中几乎所有的操作都是通过JbpmContext完成的,可以把他想像成Hibernate中的Session。

他是通过JbpmConfiguration.createJbpmContext()方法创建的,JbpmContext中包装有一个Hibernate的Session(通过他做的数据库操作)。

使用完JbpmContext后一定要调用他的close()方法,否则所有信息都不会持久化到数据库当中。

因为在调用JbpmConfiguration.createJbpmContext()方法时会创建一个Hibernate的Session并开始事务;在调用JbpmContext.close()方法时会提交事务并且关闭所关联的Session。

如果在执行JbpmContext.close()之前调用方法jbpmContext.setRollbackOnly(),则在JbpmContext.close()时会回滚事务。

4.部署流程定义

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

解析流程定义大致有三种方式,所使用的方法都在ProcessDefinition中,并且都是static的:

1)parseXmlResource,parseXmlInputStream和parseXmlReader,是解析一个xml的流程定义文件;

2)parseXmlString,是解析一个字符串;

3)parseParResource与parseParZipInputStream是解析一个par包。

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

Processarchive(par),流程档案文件,是一个zip文件。

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

以下是部署流程的实现相关代码:

@Test

publicvoiddeployProcessDefinition(){

//1,从文件到实体

//ProcessDefinitionpd=ProcessDefinition.parseXmlString(xml);

//接受流程定义文件

//ProcessDefinitionpd=ProcessDefinition.parseXmlInputStream(inputStream);

//ProcessDefinitionpd=ProcessDefinition.parseXmlReader(reader);

//ProcessDefinitionpd=ProcessDefinition.parseXmlResource("first/processdefinition.xml");

//接受流程定义文档

//ProcessDefinitionpd=ProcessDefinition.parseParZipInputStream(zipInputStream);

ProcessDefinitionpd=ProcessDefinition.parseParResource("firstPD.zip");

//2,从实体到数据库

JbpmConfigurationjbpmConfiguration=JbpmConfiguration.getInstance();

JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();//session

try{

jbpmContext.deployProcessDefinition(pd);

}catch(Exceptione){

jbpmContext.setRollbackOnly();//告诉JbpmContext在close的时候回滚

thrownewRuntimeException(e);

}finally{

jbpmContext.close();

}

}

流程定义不应该改变,因为预测流程变化带来的所有可能的影响是非常困难的(或者说是不可能的)。

围绕这个问题,jBPM有一个明智的流程版本机制。

版本机制允许在数据库中多个同名流程定义共存,流程实例以当时的最新版本来启动,并且在它的整个生命周期中将保持以相同的流程定义执行。

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

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

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

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

5.执行流程

流程实例可以通过ProcessDefinition.createProcessInstance()方法创建,或者是使用newProcessInstance(ProcessDefinitionpd)并传递一个流程定义来创建,总之创建的流程实例一定是要是属于(使用)某个流程定义的。

启动流程后不要忘了使用ProcessInstance.signal()方法离开开始状态。

注意:

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

任务列表:

当前需要办理(未完成)的任务集合。

可以通过TaskMgmtSession获得。

开始任务的方法为:

TaskInstance.start();结束任务为:

TaskInstance.end(),TaskInstance.end(StringtransitionName);无参的end()方法是使用第一个transition离开节点;第二个方法是指定完成任务后使用指定的transition离开节点。

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

下面是执行流程的相关代码:

@Test

publicvoidstartProcessInstance(){

JbpmConfigurationjbpmConfiguration=JbpmConfiguration.getInstance();

JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();//session

ProcessDefinitionpd=jbpmContext.getGraphSession().findLatestProcessDefinition("first");

//ProcessInstancepi=newProcessInstance(pd);

ProcessInstancepi=pd.createProcessInstance();

jbpmContext.save(pi);

//signal

pi.getRootToken().signal();

jbpmContext.close();

}

@Test

@SuppressWarnings("unchecked")

publicvoidgetTaskList(){

JbpmConfigurationjbpmConfiguration=JbpmConfiguration.getInstance();

JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();//session

StringactorId="员工张三";

//StringactorId="经理李四";

ListtaskList=jbpmContext.getTaskList(actorId);

System.out.println("\n-------------------------"+actorId+"的任务列表");

for(TaskInstanceti:

taskList){

System.out.println("id="+ti.getId()//

+",name="+ti.getName()//

+",actorId="+ti.getActorId()//

+",create="+ti.getCreate()//

+",start="+ti.getStart()//

+",end="+ti.getEnd());

}

System.out.println();

jbpmContext.close();

}

@Test

publicvoidstartTask(){

JbpmConfigurationjbpmConfiguration=JbpmConfiguration.getInstance();

JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();//session

TaskInstanceti=jbpmContext.getTaskInstance(3);

ti.start();

jbpmContext.close();

}

@Test

publicvoidendTask(){

JbpmConfigurationjbpmConfiguration=JbpmConfiguration.getInstance();

JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();//session

TaskInstanceti=jbpmContext.getTaskInstance(3);

//ti.end();

ti.end("toend");

jbpmContext.close();

}

在员工填写报销单任务完成前,应把业务数据"报销金额"与流程关联起来,可以通过设置流程变量实现。

流程变量是与流程实例关联的,并且会持久化到数据库中。

不同的流程实例是互不相干的,就好比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|流程变量

+-------------------+----------------------+-----------

在Jbpm中,标识各个节点的类型是不同的,功能也各不相同。

今天,在课堂上,汤老师重点为我们讲解了各个节点的作用及用法。

1.节点

不同的节点类型代表不同的行为。

<1>start-state

开始节点,标识流程开始边界。

开始状态有且只有一个,就是说流程中不能有任何

transition指向开始节点。

在流程实例被创建后(启动),RootToken(根令牌)就指向start-state,并且处于等待状态,需要给Token发信号(signal)才能使流程继续执行。

<2>end-state

结束节点,标识流程的结束边界。

不需要transition元素。

<3>task-node

任务节点,可以包含任意数量的Task(任务)。

当执行到一个任务节点的时候,将会根据这个task-node中的task的定义,创建相同数量的TaskInstance(为

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1