工做流引擎Activiti

写于2018-03-28html

背景:
在计算机还没有普及时,许多工做流程采用手工传递纸张表单的方式,一级一级审批签字, 工做效率很是低下,对于数据统计以及生成报表的功能,须要通过大量的手工操做才能实现。 随着电脑的普及,这些工做的参与者只须要在电脑的系统中填入工做内容,系统就会按照定义好的流程自动执行,各级审批者能够获得工做的信息并做出相应的审批和管理操做,数据统计和报表的生成均由系统代为完成,这样大大提升了工做效率,在这种背景下,各类工做流应用以及中间件应运而生前端

定义:
工做流(Workflow),是对工做流程及其各操做步骤之间业务规则的抽象、归纳、描述。 工做流建模,即将工做流程中的工做如何先后组织在一块儿的逻辑和规则在计算机中以恰当的 模型进行表示并对其实施计算。工做流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预约规则自动传递文档、信息或者任务。java

适用行业:
制造业,电信服务业,银证保险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,大型企业集团。
PS:21世纪初工做流曾是当时IT行业最热门的概念之一,就像今天的区块链。node

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 统一了工做流社区。mysql

工做流引擎选择(Java):
一、最原始的“工做流实现”,拼接处理页面,经过数据库表当前处理人的变动实现流转。
优势:简单。缺点:硬编码,强耦合。
二、自研实现工做流,如多数国内的OA系统。
优势:定制化程度高。缺点:研发资源投入较高,对核心研发人员技术要求很高。
三、国内收费工做流引擎。
优势:多数是在开源引擎上作了二次封装。 缺点:质量良莠不齐,通常不建议使用
四、开源工做流实现( jBPM、OSWorkflow、Activiti)。
优势:通用灵活。缺点:为适合国情需作二次封装spring

某OA自研工做流核心:
一、动态表单后端DDL生成Table,前端的表单与后端生成的某个表一一对应
二、表单布局经过存储html片段实现
三、流程定义经过pipeinfo、nodeinfo 配置,流程实现表为workflowbase
四、流程节点图使用js生成sql

三大开源工做流引擎对比(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.csdn.net/rosten/article/details/35220867

Activiti体验-app
Image
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基础-简单流程开发步骤
一、设计流程(Modeler、Activiti Design)
二、部署流程(流程模板->流程实例->执行实例->任务)
三、启动流程
四、全部参与方按序完成各自任务
五、任务结束,数据进入history归档

Activiti基础-表单类型
一、Form properties
二、Form Key 指定一个类html模板文件
三、Form Key 指定URL

Activiti基础-表单1

Activiti基础-表单2和3

Activiti基础-三种表单优缺点对比
表单1:简单方便, 排版单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代码的)或使用动态代码(业务规则引擎)!

相关文章
相关标签/搜索