JBPM工作流详解.docx

上传人:b****7 文档编号:10899965 上传时间:2023-02-23 格式:DOCX 页数:34 大小:141.96KB
下载 相关 举报
JBPM工作流详解.docx_第1页
第1页 / 共34页
JBPM工作流详解.docx_第2页
第2页 / 共34页
JBPM工作流详解.docx_第3页
第3页 / 共34页
JBPM工作流详解.docx_第4页
第4页 / 共34页
JBPM工作流详解.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

JBPM工作流详解.docx

《JBPM工作流详解.docx》由会员分享,可在线阅读,更多相关《JBPM工作流详解.docx(34页珍藏版)》请在冰豆网上搜索。

JBPM工作流详解.docx

JBPM工作流详解

工作流(JBPM)详解

1工作流基础

1.1.工作流相关概念

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

通俗的说,流程就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是工作流。

 

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

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

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

1.定义工作流:

包括具体的活动、规则等

2.运行控制功能:

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

3.运行交互功能:

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

一、定义工作流

二、执行工作流

采用工作流管理系统的优点

1.提高系统的柔性,适应业务流程的变化 

2.实现更好的业务过程控制,提高顾客服务质量

3.降低系统开发和维护成本

工作流框架有:

Jbpm、OSWorkflow、ActiveBPEL、YAWL等

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

1.2.开源工作流jBPM4.4介绍

jBPM即javaBusinessProcessManagement,是基于java的业务流程管理系统。

jBPM是市面上相当流行的一款开源工作流引擎,引擎底层基于ActiveDiagram模型。

jBPM4.4使用了hibernate(3.3.1版),因此可以很好的支持主流数据库。

jBPM4.4共有18张表。

jBPM官方主页:

http:

//www.jboss.org/jbpm

2.准备jBPM4.4环境

2.1.jBPM4.4所需环境

jBPMrequiresaJDK(standardjava)version5orhigher.

Toexecutetheantscripts,you'llneedapacheantversion1.7.0orhigher:

http:

//ant.apache.org/bindownload.cgi

2.2.下载相关资源

1,jBPM下载地址:

2,Eclipse下载地址(EclipseIDEforJavaEEDevelopers(163MB),Version:

3.5):

http:

//www.eclipse.org/downloads/download.php?

file=/technology/epp/downloads/release/galileo

2.3.安装流程设计器(GPD,Eclipse插件)

GPD(GraphicalProcessDesigner)是一个Eclipse插件。

安装方法说明(jBPM4.4UserGuide,2.11.2.InstalltheGPDpluginintoeclipse):

Help-->InstallNewSoftware...

ClickAdd...

IndialogAddSitedialog,clickArchive...

Navigatetoinstall/src/gpd/jbpm-gpd-site.zipandclick'Open'

ClickingOKintheAddSitedialogwillbringyoubacktothedialog'Install'

SelectthejPDL4GPDUpdateSitethathasappeared

ClickNext...andthenFinish

Approvethelicense

Restarteclipsewhenthatisasked

 

查看是否成功安装了插件:

WindowPreference中是否有JbossjBPM项。

2.4.在Eclipse中添加jPDL4.4Schema校验

流程定义文件的xsd文件的路径为:

JBPM_HOME/src/jpdl-4.4.xsd。

添加到Eclipse中的方法为(jBPM4.4UserGuide,2.11.5.AddingjPDL4schematothecatalog):

ClickWindow-->Preferences

SelectXML-->XMLCatalog

Click'Add...'

The'AddXMLCatalogEntry'dialogopens

Clickthebuttonwiththemap-iconnexttolocationandselect'FileSystem...'

Inthedialogthatopens,selectfilejpdl-4.4.xsdinthesrcdirectoryofthejBPMinstallationroot.

Click'Open'andcloseallthedialogs

2.5.准备jBPM4.4的开发环境

2.5.1.添加jBPM4.4的jar包

1.${JBPM_HOME}/jbpm.jar(核心包)

2.JBPM_HOME/lib/*.jar,不添加以下jar包:

servlet-api.jar,junit.jar。

其中junit.jar一定不要添加,因为是3.8.2版本,与我们使用的junit4有冲突。

3.所使用的数据库对应的驱动的jar包(第2步所添加的jar包中已包含mysql的jdbc驱动jar包)。

2.5.2.添加并定制配置文件

1.配置文件可以从JBPM_HOME/examples/src/中拷贝:

jbpm.cfg.xml、

logging.properties、

jbpm.hibernate.cfg.xml。

2.修改logging.properties中的日志输出级别为WARNING:

java.util.logging.ConsoleHandler.level=WARNING

3.修改jbpm.hibernate.cfg.xml中的数据库连接信息。

如果使用MySql,使用的方言一定要是org.hibernate.dialect.MySQL5InnoDBDialect。

4.数据库连接编码一定要是UTF-8。

否则可能会在部署含有中文字符的流程定义时会抛异常,说sql语法错误。

 

说明:

如果要改变jbpm.hibernate.cfg.xml的文件名称,需要做:

1、从JBPM_HOME/src/中拷贝jbpm.tx.hibernate.cfg.xml放到工程的src/下,然后进行修改。

2、修改jbpm.tx.hibernate.cfg.xml中的hibernate主配置文件的路径配置(指定的是相对于classpath的相对路径)。

2.5.3.初始化数据库

1,方法一:

执行sql脚本文件${JBPM4.4_HOME}/install/src/db/create/jbpm.*.create.sql

2,方法二:

使用Hibernate的自动建表,在jbpm.hibernate.cfg.xml中配置:

hibernate.hbm2ddl.auto=update。

3.核心概念与相关API(ServiceAPI)

3.1.概念:

Processdefinition,processinstance,execution

3.1.1.Processdefinition

ProcessDefinition,流程定义:

一个流程的步骤说明。

如一个请假流程、报销流程、借款流程等,是一个规则。

例:

3.1.2.Processinstance

ProcessInstance,流程实例:

代表流程定义的一次执行。

如张三昨天按请假流程请了一次假。

一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针。

3.1.3.Execution

Execution,执行:

一般情况下,一个流程实例是一个执行树的根节点。

使用树状结构的原因在于,这一概念只有一条执行路径,使用起来更简单。

业务API不需要了解流程实例和执行之间功能的区别。

因此,API里只有一个执行类型来引用流程实例和执行。

假设汇款和存档可以同时执行,那么主流程实例就包含了2个用来跟踪状态的子节点:

4.1.ProcessEngine与ServiceAPI

4.1.1.Configuration与ProcessEngine

InteractingwithjBPMoccursthroughservices.TheserviceinterfacescanbeobtainedfromtheProcessEnginewhichisbuildfromaConfiguration.AProcessEngineisthreadsafeandcanbestoredinastaticmemberfield.

使用默认的配置文件(jbpm.cfg.xml)生成Configuration并构建ProcessEngine:

ProcessEngineprocessEngine=newConfiguration()

.buildProcessEngine();

或是使用如下代码获取使用默认配置文件的、单例的ProcessEngine对象:

ProcessEngineprocessEngine=Configuration.getProcessEngine();

或是使用指定的配置文件(要放到classPath下):

ProcessEngineprocessEngine=newConfiguration()

.setResource("my-own-configuration-file.xml")

.buildProcessEngine();

4.1.2.jBPMServiceAPI

jBPM所有的操作都是通过Service完成的,以下是获取Service的方式:

RepositoryServicerepositoryService=processEngine

.getRepositoryService();

ExecutionServiceexecutionService=processEngine

.getExecutionService();

TaskServicetaskService=processEngine

.getTaskService();

HistoryServicehistoryService=processEngine

.getHistoryService();

ManagementServicemanagementService=processEngine

.getManagementService();

各个Service的作用:

RepositoryService

管理流程定义

ExecutionService

管理执行的,包括启动、推进、删除Execution等操作

TaskService

管理任务的

HistoryService

历史管理(执行完的数据管理,主要是查询)

IdentityService

jBPM的用户、组管理

ManagementService

4.1.3.API风格

方法调用链

每一个方法都是流程有关的一个业务操作,默认是一个独立的事务。

4.1.4.查询的有关API(风格)

功能说明

相应的查询API

查询“流程定义”

ProcessDefinitionQueryprocessDefinitionQuery=

processEngine.getRepositoryService()

.createProcessDefinitionQuery();

查询“执行对象”

(流程实例)

ProcessInstanceQueryprocessInstanceQuery=

processEngine.getExecutionService()//

.createProcessInstanceQuery();

查询“任务”

TaskQuerytaskQuery=//

processEngine.getTaskService()//

.createTaskQuery();

查询“执行历史”

(流程实例历史)

HistoryProcessInstanceQueryhistoryProcessInstanceQuery=

processEngine.getHistoryService()

.createHistoryProcessInstanceQuery();

查询“任务历史”

HistoryTaskQueryhistoryTaskQuery=

processEngine.getHistoryService()

.createHistoryTaskQuery();

以上列出的Query对象有:

1.ProcessDefinitionQuery

2.ProcessInstanceQuery

3.TaskQuery

4.HistoryProcessInstanceQuery

5.HistoryTaskQuery

这些Query对象的使用方法都是一致的,如下所示:

1,添加过滤条件:

调用其中的有关方法指定条件即可。

如:

a)processDefinitionQuery.processDefinitionKey("请假")是指定查询key为”请假”的流程定义;

b)taskQuery.assignee("张三")是指定办理人为”张三”的任务。

2,添加排序条件:

a)调用xxQuery.orderAsc(property),表示按某属性升序排列

b)调用xxQuery.orderDesc(property),表示按某属性降序排列

c)可指定多个排序条件,就是代表第1顺序,第2顺序…等。

d)属性名在各自的Query对象(接口)中有常量定义,如:

i.ProcessDefinitionQuery.PROPERTY_ID

ii.ProcessDefinitionQuery.PROPERTY_KEY

iii.TaskQuery.PROPERTY_NAME

iv.TaskQuery.PROPERTY_ASSIGNEE

3,指定分页有关信息:

a)调用方法xxQuery.page(firstResult,maxResults);

b)这是指定first与max的值(就是Hibernate中的Query.setFirstResult()与Query.setMaxResults())

c)如果没有调用这个方法,代表要查询出符合条件的所有记录。

4,查询得到结果:

a)调用方法xxQuery.list();表示查询列表

b)调用方法xxQuery.uniqueResult();表示查询唯一的结果

c)调用方法xxQuery.count();表示查询符合条件的记录数量

5.管理流程定义

没有更新功能

5.1.部署流程定义

注意区分Deployment与ProcessDefinition

5.1.1.示例代码1:

流程定义有关文件在classpath中

StringdeploymentId=processEngine.getRepositoryService()

.createDeployment()

.addResourceFromClasspath("process/test.jpdl.xml")

.addResourceFromClasspath("process/test.png")

.deploy();

5.1.2.示例代码2:

一次添加多个流程定义有关文件(要先打成zip包)

StringdeploymentId=processEngine.getRepositoryService()

.createDeployment()

.addResourcesFromZipInputStream(zipInputStream)

.deploy();

5.1.3.说明

1,.addResourceFromClasspath(resource);可以调用多次以添加多个文件。

文件重复添加也不会报错。

2,.addResourceFromInputStream(resourceName,inputStream)添加一个文件(使用InputStream)

3,.addResourcesFromZipInputStream(zipInputStream)添加多个文件,里面也可以有文件夹。

4,以上方法可以在一起调用。

5.2.删除流程定义

5.2.1.示例代码1:

删除流程定义,如果有关联的流程实例信息则报错

repositoryService.deleteDeployment(deploymentId);

5.2.2.示例代码2:

删除流程定义,并删除关联的流程实例与历史信息

repositoryService.deleteDeploymentCascade(deploymentId);

5.3.查询流程定义

5.3.1.相关查询API说明:

ProcessDefinitionQuery

RepositoryService.createProcessDefinitionQuery()

5.3.2.示例代码1:

查询所有流程定义

//1,构建查询

ProcessDefinitionQuerypdQuery=processEngine.getRepositoryService()

.createProcessDefinitionQuery()//

.orderAsc(ProcessDefinitionQuery.PROPERTY_NAME)//

.orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION);

//2,查询出总数量与数据列表

longcount=pdQuery.count();

Listlist=pdQuery.page(0,100).list();//分页:

取出前100条记录

//3,显示结果

System.out.println(count);

for(ProcessDefinitionpd:

list){

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

+",deploymentId="+pd.getDeploymentId()//

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

+",version="+pd.getVersion()//

+",key="+pd.getKey());//

}

5.3.3.示例代码2:

查询所有最新版本的流程定义列表

//1,查询,按version升序排序,则最大版本排在最后面

Listall=processEngine.getRepositoryService()//

.createProcessDefinitionQuery()//

.orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)

.list();

//2,过滤出所有不同Key的最新版本(因为最大版本在最后面)

Mapmap=newHashMap();//map的key是流程定义的key,map的vlaue是流程定义对象

for(ProcessDefinitionpd:

all){

map.put(pd.getKey(),pd);

}

Collectionresult=map.values();

//3,显示结果

for(ProcessDefinitionpd:

result){

System.out.println("deploymentId="+pd.getDeploymentId()//

+",\tid="+pd.getId()//流程定义的id,格式:

{key}-{version}

+",\tname="+pd.getName()

+",\tkey="+pd.getKey()

+",\tversion="+pd.getVersion());

}

5.4.获取部署对象中的文件资源内容

//资源的名称,就是jbpm4_lob表中的NAME_列表值

StringdeploymentId="90001";

StringresourceName="test.png";

InputStreamin=processEngine.getRepositoryService()

.getResourceAsStream(deploymentId,resourceName);

5.5.获取流程图中某活动的坐标

StringprocessDefinitionId="test-1";//流程定义的id

StringactivityName="start1";//活动的名称

ActivityCoordinatesc=processEngine.getRepositoryService()

.getActivityCoordinates(processDefinitionId,activityName);

System.out.println("x="+c.getX()

+",y="+c.getY()

+",width="+c.getWidth()

+",height="+c.getHeight());

6.执行流程实例

6.1.启动流程实例

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

当前位置:首页 > 高等教育 > 历史学

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

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