Activiti工作流

 说明:本文章内容在我最大努力范围之内确保其正确性、实效性和可观性,但并不代表所有的观点都是正确的,而仅代表个人看法。如发现不当之处,请多指教,谢谢!

 

一、工作流

1.工作流

工作流(workflow),就是让计算机帮我们实行部分或全部的业务工作流程、逻辑的自动化执行管理,实现多个参与者按照预定的流程去自动执行业务流程。

主要解决的是:使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现。

2. 工作流引擎

工作流引擎是指工作流(workflow)作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。

比如开发一个系统最关键的部分是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性、易维护性和弹性。

比如系统中有一个任务流程,一般情况下这个任务的代码逻辑、流程都要自己来编写。实现是没有问题的,但开发过程中可能存在纰漏,所以,经过无数次的测试与改进,整个流程没有任何漏洞也是可以实现的,但是明显就会拖慢整个项目的进度。

 工作流引擎解决的就是这个问题:如果应用程序缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。

3.工作流生命周期

Activiti工作流

二、Activiti概述

1.简介

Activiti是一个开源的工作流引擎(框架,组件,jar包),通常activiti引擎需要嵌入到业务系统中去运行;它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。

其核心是基于Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。

Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。

 

Activiti前身 是jbpm4,Activiti架构和jbpm4基本上是一样的。activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

1.1       BPM

Bpm(Business Process Management),业务流程管理,是一种理念,以持续的提高组织业务绩效为目的系统化方法,常见商业管理教育如EMBA、MBA等均将BPM包含在内。

1.2       BPMN

bpmn(Business Process Model andNotation),业务流程模型和符号。和bpm是两个不同的概念。Activiti使用bmpn标准进行流程建模。是由BPMI(Business Process Management Initiative)开发的一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。

具体发展历史:

 

Activiti工作流

BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准。Activiti 就是使用 BPMN 2.0 进行流程建模、流程执行管理,它包括很多的建模符号,比如:

Event 用一个圆圈表示,它是流程中运行过程中发生的事情。

 

Activiti工作流

活动用圆角矩形表示,一个流程由一个活动或多个活动组成。

 

Activiti工作流

 

一个bpmn图形的例子:

 

Activiti工作流

 

 

Activiti使用Bpmn2.0标准进行流程定义(流程建模),bpmn采用xml描述 。

 

Activiti工作流

 

如何使用bpmn进行流程建模:

一般使用建模工具进行流程图绘制,生成一个图形,通过工具查看bpmn的xml描述;若熟练,手动编写pbmn的xml文档。(对坐标和结点大小通过工具完成)

 

2.特点

A.数据持久化

B.引擎Service接口

C.流程设计器

D.原生支持Spring

E.分离运行时与历史数据

 

3.应用场景

3.1系统集成方面的应用

        与规则引擎整合;

        与ESB整合;

3.2其他行业、产品方面的应用

Activiti的适用行业、在企业中的应用都很广泛,一般有“业务流转”流程化的场景,都可以使用工作流。

行业:

      比如:物流服务业、物流管理、金融服务业、*机构、教育服务业等;

企业工作流系统应用方面:

文档管理、协作、事务处理、系统运维的故障处理流程、hr系统中的流程管理等等;其中,

关键业务流程:订单、报价处理、采购处理、合同审核、供应链管理等

行政管理类:出差申请、加班申请、请假申请等原来手工流转处理的行政表单。

人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。

财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。

客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。

特殊服务类:物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。

 

 

4.架构与组件

 

Activiti工作流

5.优点

(参考纵观jBPM:从jBPM3到jBPM5以及Activiti5 文档)

 

jBPM3是一个完整的工作流系统实现,面向开发人员,目的在于简化对组织核心流程进行支撑的软件创建,不支持标准。

jBPM4引入PVM,使其拥有更强大的扩展性,同时增加BPMS特性,这些特性包括了对BPMN的支持、面向业务人员的Web建模器和简单统计分析功能的加入。

jBPM5基于原先的Drools Flow,支持BPMN,通过与Drools的合并支持BAM,通过内容仓库增加对流程可视化的支持。由于放弃了jBPM4的PVM,引擎的可扩展性受到损害,并且不再支持jPDL。

Activiti5基于jBPM4,与Alfresco的集成增加了其流程可视化与管理能力,同时通过创新的Activiti Cycle协作组件支持流程相关人员之间的协调,最后,它加强了集成能力。

对于工作流应用或者jBPM3、jBPM4的老用户,建议转向Activiti5。

 

Activiti工作流

 

 

6.四种启动模式及其应用场景

Activiti工作流

Activiti工作流

 

7.文档说明

Activiti下载地址:

http://activiti.org/download.html

 

官方用户手册:

http://www.mossle.com/docs/activiti/index.html#sources

 

源码:

https://github.com/Activiti/Activiti

 

activiti-explorer war包:

http://blog.csdn.net/u010871004/article/details/61636288

 

三、开发步骤和原则

1. Activiti开发步骤:

A.在需求阶段,分析出业务流程

     B.设计阶段,确定哪些业务流程由activiti管理,对工作流管理的流程进行流程定义。

流程定义时和功能设计同步进行:

1》   确定流程启动所对应的功能

2》   确定流程执行中哪些功能和流程结点对应,哪个功能可以将流程向后推进一步

2.Activiti开发遵循原则:

          A. 角色分工明确,activiti负责流程管理 ,业务系统 负责业务功能。

          B. 业务系统 中通常在service层将activiti和控制层、持久层进行隔离(解耦),比如在业务功能中需要查询activiti的流程数据,需要自定义一个对象存储activiti的数据。

         C. 数据共享问题,在activiti中存储businesskey(业务标识),通过businesskey查询业务系统 数据,在业务系统 中存储activiti的标识(比如在用印单审批流程中存储流程实例的id),在查询业务数据时通过此流程实例 id查询activiti的数据。达到目标:activiti和业务系统 能互相关联查询。

 

四、开发环境准备

1. eclipse安装activiti插件

打开 Help->Install New Software. 点击 Add 按钮, 然后填入下列字段:

Name: Activiti

Location: http://activiti.org/designer/update/

然后一步步的安装就可以了。

 

http://blog.csdn.net/lovemenghaibin/article/details/50568858

2.下载Activiti源码

https://github.com/Activiti/Activiti

了解 目录结构、文件目录

3.环境配置检查

Jdk、maven、Ant(示例程序需在ant构建)。

 

4.activiti-explorer

下载配置并运行activiti-explorer:

http://blog.csdn.net/u010871004/article/details/61636288

 

 

五、Activiti服务架构

1.架构图

 

Activiti工作流

Activiti核心配置文件:activiti.cfg.xml

ProcessEngineConfiguration:通过activiti.cfg.xml创建。

ProcessEngine:通过ProcessEngineConfiguration创建

Service:通过ProcessEngine获取。 (核心重点)

 

2. activiti.cfg.xml配置文件

 是spring配置文件。

Activiti通过该文件创建processEngineConfiguration;

通过processEngineConfiguration创建processEngine;

在classpath(source folder格式的)下创建activiti.cgf.xml文件:

包括:配置数据源、ProcessEngineConfiguration

 

Activiti工作流

 

3. ProcessEngineConfiguration

3.1StandaloneProcessEngineConfiguration

用于activiti单独 运行

 

Activiti工作流

3.2SpringProcessEngineConfiguration

Spring和activiti整合后使用该类。

 

和spring整合后,直接从spring容器中获取ProcessEngine及各种service。

 

Activiti工作流

 

Activiti工作流

 

 

3.3创建processEngineConfiguration

 

ProcessEngineConfigurationconfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")

上边的代码要求activiti.cfg.xml中必须有一个processEngineConfiguration的bean;

也可用下边的方法,更改bean的名字:

ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(Stringresource, String beanName);

4. ProcessEngine

是一个门面接口,通过该门面得到各种service。

 

编程方式:

 

// 通过ProcessEngineConfiguration创建引擎对象ProcessEngine

      ProcessEngineprocessEngine = configuration.buildProcessEngine();

 

简单方式:

不通过ProcessEngineConfiguration创建,processEngine,使用下边的代码创建成功。

 

//使用classpath下的activiti.cfg.xml(名称固定),配置中有id为processEngineConfiguration(名称也固定)配置的,创建processEngine

      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

      System.out.println(processEngine);

5. Service

5.1七大service接口

RepositoryService

Activiti的资源管理类,用于管理流程仓库;例如:流程部署,获取流程部署的资源,删除、读取流程资源。

RuntimeService

activiti的流程运行管理类,用于启动一个流程实例,处理当前所有正在运行状态的流程实例、任务等信息。

TaskService

activiti的任务管理类,用于管理、查询任务(个人任务、租任务),像:签收、办理、指派等。

HistoryService

activiti的历史管理类,查询所有历史数据,如:流程实例、任务、活动、变量、附件等。

IdentityService

activiti的用户身份管理类,设置用户、组(角色)、用户和组关系。

FormService

activiti的表单管理类,实现activiti中读取和流程、任务相关的表单数据。

ManagerService

activiti的引擎管理类,和具体业务无关,用于activiti运行的监控(查询引擎配置、数据库、作业等),给超级管理员使用。

注:红色标注为常用service。

5.2创建方式

通过ProcessEngine创建Service。

调用ProcessEngine.getXXXXX方法获取service。

注意:和spring整合后,service直接可以从spring容器中获取。

六、Activiti使用实现过程

 

//获取默认的流程引擎实例会自动读取activiti.cfg.xml文件

private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();

步骤一:部署activiti环境

基本的开发环境、Jar包、数据库

 

Activiti工作流

 

创建数据库方式:

方式1:使用activiti目录 database下的数据库创建脚本创建数据库。

方式2:使用java程序 自动创建数据库。

Java程序 可以 自动:创建、删除、升级数据库。

 

Java程序创建数据库思路:

通过java程序创建activiti核心引擎对象(ProceccEngine),创建引擎对象时,自动检测数据库环境,根据设置activiti数据库操作策略,操作数据库。

比如:策略设置为true,若不存在则自动创建表。

 

 Activiti工作流

Activiti自动创建的表:

     

Activiti工作流

 

表命名规则:

Activiti的表都以ACT_开头。第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

·        ACT_RE_*:'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。

·        ACT_RU_*:'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

·        ACT_ID_*:'ID'表示identity。 这些表包含身份信息,比如用户,组等等。

·        ACT_HI_*:'HI'表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。

·        ACT_GE_*: GE表示general。通用数据, 用于不同场景下。

步骤二:流程定义

业务分析人员(系统设计人员)在线下使用activity-Desinger绘制流程图。

比如:定义一个请假审批流程(bpmn的xml描述),静态的

 

步骤三:向activiti中部署流程定义

让activiti去管理某个业务流程,需使用activiti的api将线下定义的流程部署到activiti数据库中。

两种方式:单个文件部署 和 加载压缩包文件部署。

 

单个文件部署:加载资源文件的不同方式:

 

Activiti工作流

 

压缩包文件部署:

 

Activiti工作流

步骤四:启动流程实例

必须先启动一个流程实例, activiti才能开始去管理控制这个业务流程。

 

比如:张三创建申请单启动一个流程实例;李四创建申请单也启动一个流程实例。

简单理解为:java类和java对象。

启动流程实例的两种方法:

其一:直接根据流程定义标识启动

 

Activiti工作流

其二:启动时指定流程实例对应的业务标识

(企业中常用,涉及到和业务系统整合)

 

Activiti工作流

 

数据库表:

act_ru_execution 流程实例执行表:记录了流程实例的当前执行信息,如果该流程实例结束,流程实例的执行信息从该表删除。

act_hi_procinst  流程实例历史表:记录流程实例的历史 信息

 

步骤五:查询流程待办任务

当前用户查询当前需要自己办理的任务,由activiti自动化管理。

当前用户登陆系统,通过activiti的api得到当前用户的待办任务(activiti所有管理流程,该用户的待办任务都能查询到),不需要由业务流程进行处理。

 

Activiti工作流

 

步骤六:办理任务

办理任务要填写的信息由业务系统来处理,任务办理后流程执行到哪一步由activiti自动管理。

任务完成后,流程的执行由activiti自动管理。

 

Activiti工作流

 

步骤七:流程结束

当流程运行到最后一个结点,流程结束。

 

Activiti工作流

 

七、HelloWorldDemo

1.Demo实现:

A.从流程定义、流程定义部署、启动一个流程实例、查询待办任务、办理任务、流程结束 。

B.修改流程,测试如果不改代码是否能执行通过。

C.目的:对activiti有一个整体的体验。

2.配置数据库执行策略

关于processEngineConfiguration中的databaseSchemaUpdate参数,通过此参数设计activiti数据表的处理策略,参数如下:

false(默认):检查数据库表版本和依赖库版本, 若版本不匹配就抛出异常。

true(常用): 构建流程引擎时,执行检查。若需要就执行更新;若表不存在,就创建。

create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表。

drop-create:先删除表再创建表。(常用,使用完成后改为true)

create: 构建流程引擎时创建数据库表, 关闭流程引擎时不删除这些表。

3.编写日志文件

 

Activiti工作流

 

八、知识点整理

 单独的文档整理

九、问题总结

1.流程变动后,如何操作?

修改完流程后,不用修改业务代码(因为activiti将流程自动化管理了),但需要重新部署,重新启动流程实例,;

若业务功能修改了,就需要修改业务系统的代码。

 

2.流程定义和流程实例区别

参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,发起的这个流程就是一个流程实例。是动态的。

流程定义和流程实例图解:

 

Activiti工作流

总结:

流程定义是静态的,流程实例是动态的;

流程实例的启动是需要参与者来操作的,流程实例按照流程定义来启动;

不同的流程实例之间互不影响 ;

使用流程实例记录不同流程的执行过程。

 

十、深入开发