JBPM工作流详解.docx
《JBPM工作流详解.docx》由会员分享,可在线阅读,更多相关《JBPM工作流详解.docx(34页珍藏版)》请在冰豆网上搜索。
![JBPM工作流详解.docx](https://file1.bdocx.com/fileroot1/2023-2/23/c837812e-f68f-42bd-a5ea-930e9b639af4/c837812e-f68f-42bd-a5ea-930e9b639af41.gif)
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.启动流程实例
说