背景:
在计算机尚未普及时,许多工作流程采用手工传递纸张表单的方式,一级一级审批签字, 工作效率非常低下,对于数据统计以及生成报表的功能,需要经过大量的手工操作才能实现。 随着电脑的普及,这些工作的参与者只需要在电脑的系统中填入工作内容,系统就会按照定义好的流程自动执行,各级审批者可以得到工作的信息并作出相应的审批和管理操作,数据统计和报表的生成均由系统代为完成,这样大大提高了工作效率,在这种背景下,各种工作流应用以及中间件应运而生
定义:
工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。 工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的 模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。
适用行业:
制造业,电信服务业,银证保险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,*事业机构,研究院所及教育服务业等,大型企业集团。
PS:21世纪初工作流曾是当时IT行业最热门的概念之一,就像今天的区块链。
BPMN:
BPMN 规范 1.0 版本由 BPMI 组织于 2004 年发布,全称是 Business Process Modeling Notation,BPMN 规范的发布是为了让业务流程的全部参与人员对流程可以进行可视化管理,提供一套让所有参与人员都易于理解的语言和标记,为业务流程的设计人员(非技术人员)和流程的实现人员(技术人员)建立起一座桥梁。BPMN2.0 规范于 2011 年 1 月正式发布,并且全称改为 Business Process Model And Notation(业务流程模型和符号)。BPMN 2.0 流程定义模型不仅仅可以在任何兼容 BPMN 2.0 的引擎中执行,而且也可以在图形编辑器间交换。作为一个标准,BPMN 2.0 统一了工作流社区。
工作流引擎选择(Java):
1、最原始的“工作流实现”,拼接处理页面,通过数据库表当前处理人的变更实现流转。
优点:简单。缺点:硬编码,强耦合。
2、自研实现工作流,如多数国内的OA系统。
优点:定制化程度高。缺点:研发资源投入较高,对核心研发人员技术要求很高。
3、国内收费工作流引擎。
优点:多数是在开源引擎上做了二次封装。 缺点:质量参差不齐,一般不建议使用
4、开源工作流实现( jBPM、OSWorkflow、Activiti)。
优点:通用灵活。缺点:为适合国情需做二次封装
某OA自研工作流核心:
1、动态表单后端DDL生成Table,前端的表单与后端生成的某个表一一对应
2、表单布局通过存储html片断实现
3、流程定义通过pipeinfo、nodeinfo 配置,流程实现表为workflowbase
4、流程节点图使用js生成
三大开源工作流引擎对比(Java)
Osworkflow:只提供工作流的基本功能,相当灵活,要实现业务功能需要做大量的扩展。年代比较久远,很多资料是十多年前。(工作流使用方式与Jbpm4相似)
Jbpm:Jbpm4之后基于Drools Flow整体重构了,较Activiti重且更复杂,技术栈较陈旧(Hibernate、Ant对比Mybatis、Maven),资料较Activiti少。
Activiti: 基于Jbpm4进化而来,能较好的与Spring集成,上手较Jbpm快。
Activiti VS jBPM5:
Activiti体验-数据库
Engine 引擎核心(必须)
History 历史流程 【可选】
Identity 用户和用户组【可选】
hi = history 历史数据
id = identity 用户及用户组
ru = runtime 运行时数据
re = resource 流程定义及部署资源
详细库表说明参考:https://blog.****.net/rosten/article/details/35220867
Activiti体验-app
Activiti-explorer:流程设计、流程部署、管理及简单任务处理示例
Activiti-rest:Rest接口,可供异构系统或分布式系统实现工作流
除了用Modeler还可以用Active为Eclipse提供的插件Activiti Designer设计流程
Modeler:更适合业务人员使用
Activiti Designer:更适合开发人员使用
Activiti Explorer
核心API结构
核心Service
RepositoryService: Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件,表单定义文件,流程定义图像文件等 ),这些文件都存储在 Activiti 内建的 Repository 中。Repository Service 提供了对 repository 的存取服务。
RuntimeService:在 Activiti 中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
TaskService:在 Activiti 中业务流程定义中的每一个执行节点被称为一个 Task,对流程中的数据存取,状态变更等操作均需要在 Task 中完成。Task Service 提供了对用户 Task 和 Form 相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。
IdentityService:Activiti 中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的 Task。Identity Service 提供了对 Activiti 系统中的用户和组的管理功能。
ManagementService:Management Service 提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
HistoryService: History Service 用于获取正在运行或已经完成的流程实例的信息,与 Runtime Service 中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。
FormService: Activiti 中的流程和状态 Task 均可以关联业务相关的数据。通过使用 Form Service 可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单
Activiti基础-activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">;
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql:///activity" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="admin" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
Activiti基础-部署流程
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
.createDeployment() //创建一个部署对象
.name("helloworld入门程序")//添加部署的名称
.addClasspathResource("diagrams/MyProcess.bpmn")//从classpath的资源中加载,一次只能加载一个文件
.addClasspathResource("diagrams/MyProcess.png")//从classpath的资源中加载,一次只能加载一个文件
.deploy(); //完成部署
System.out.println("部署ID:"+deployment.getId()); //1
System.out.println("部署名称"+deployment.getName()); //helloworld入门程序
**Activiti基础-启动流程**
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("varName", "变量值");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", vars);
Activiti基础-查询及办理任务
List<Task> list = taskService.createTaskQuery()
.taskAssignee(“peng”)//查询指派给peng的任务
.list();
if(list!=null && list.size()>0){
for(Task task:list){
taskService.complete(task.getId());//办理任务
}
}
}
Activiti基础-简单流程开发步骤
1、设计流程(Modeler、Activiti Design)
2、部署流程(流程模板->流程实例->执行实例->任务)
3、启动流程
4、所有参与方按序完成各自任务
5、任务结束,数据进入history归档
Activiti基础-表单类型
1、Form properties
2、Form Key 指定一个类html模板文件
3、Form Key 指定URL
Activiti基础-表单1
Activiti基础-表单2和3
Activiti基础-三种表单优缺点对比
表单1:简单方便, 排版单一、表单里每个字段都会存储到变量表,数据量大,适合极简单业务。
表单2:排版比1灵活,适合业务简单,排版有一定要求场景。
表单3:排版随意,工作流与业务解耦,数据量灵活控制,但工作量较多,适合定制化要求较高场景。
Activiti基础-用户及用户组
Activiti的用户模型相当简单:用户、用户组,用户与用户组之间是多对多的关系。
对于需要关注参与人所属组织架构的场景(如OA)需要进行二次开发
用户任务可以指定:办理人、候选人、候选组。
候选人及候选组,(竞争)签收任务之后,就成为当前办理人。
Activiti基础-批注及附件
taskService.addComment
taskService.getTaskComments
taskService.createAttachment
taskService.getTaskAttachments
Activiti基础-流程图
方法1:ProcessDiagramGenerator 类:Java GUI
方法2:查询流程模板坐标点,通过JS画线框
Activiti实战问题:
业务数据与流程数据如何关联:业务表里存储流程实例ID即processInstanceId,流程启动时使用业务主键作为businessKey。 runtimeService .startProcessInstanceByKey第二个参数指定businessKey。
业务与引擎用户及用户组数据同步:业务用户、角色新增、修改时调用IdentityService同步用户(注意事务)
查询当前用户作为(候选人、候选组、参与人)任务:taskService.creteTaskQuery(). taskInvolvedUser(用户ID)
在线设计流程:集成Modeler到业务后台
在线部署流程:使用压缩包部署,仅支持简单类流程热部署(无需写Java代码的)或使用动态代码(业务规则引擎)!