背景:

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

定义:

工作流(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.csdn.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代码的)或使用动态代码(业务规则引擎)!

工作流引擎Activiti的更多相关文章

  1. 工作流引擎Activiti与SpringBoot2整合--开源软件诞生17

    开源ERP技术整合系列--第17篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...

  2. 工作流引擎Activiti使用总结

    http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...

  3. 工作流引擎Activiti使用总结(转)

    1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流的支持,不过当时使用 ...

  4. 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例

    Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...

  5. 工作流引擎Activiti 专题

    https://github.com/Activiti/Activiti Quick Start Guide This quick start assumes: Familiarity with Ma ...

  6. 工作流引擎activiti入门

    眼下最新的版本号是5.17 1.下载:activiti-5.17.0.zip http://activiti.org/download.html 2.解压activiti-5.17.0.zip 3.打 ...

  7. Java工作流引擎 Activiti springmvc 后台框架源码 SSM 流程审批

    工作流模块----------------------------------------------------------------------------------------------- ...

  8. Activiti工作流引擎参考资料

    Activiti工作流引擎使用 工作流-Activiti核心API介绍 传智播客Activiti工作流视频教程(企业开发实例讲解) 工作流引擎Activiti演示项目 http://www.kafei ...

  9. Activiti工作流引擎使用

    http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...

随机推荐

  1. PHP松散比较与严格比较的区别详解

    在PHP中相等的比较有两种,松散比较和严格比较,当使用松散比较时,如果进行比较的两个操作数类型不同,那么会对操作数进行适当的类型转换,如果转换后的值相同则认为两个操作数相等.而使用严格比较时,如果两个 ...

  2. c语言 正则表达式 IP地址

    #include <stdio.h> #include <string.h> #include <regex.h> #define SUBSLEN 10 /* 匹配 ...

  3. 转载:Spark中文指南(入门篇)-Spark编程模型(一)

    原文:https://www.cnblogs.com/miqi1992/p/5621268.html 前言 本章将对Spark做一个简单的介绍,更多教程请参考:Spark教程 本章知识点概括 Apac ...

  4. VS2010 如何在调试的时候输入参数

    VS2010 如何在调试的时候输入参数 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 很明显,好多算法程序实现的时候提供的例程都是需要在命令行中输入参数,比 ...

  5. 如何找到linux centos7 中 redis.conf

    我们假设redis正在运行,但是我们找不带redis的配置文件redis.conf. 正确的示范: (1)systemctl status redis ● redis.service - LSB: s ...

  6. JavaScript、TypeScript、ES6三者之间的联系和区别

    ES6是什么 ECMAScript 6.0(以下简称ES6)是JavaScript语言(现在是遵循ES5标准)的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以 ...

  7. 用ExtentReports美化你的测试报告

    前言 在实际的自动化测试工作中经常会用到一些报告生成工具大概分为两类,一类是测试框架自带的报告生成工具如:JUnit+Ant.TestNG:另一类就是专用报告工具如ReportNG等.这些报告要么在U ...

  8. 【leetcode算法-简单】66. 加一

    [题目描述] 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示 ...

  9. 《Tsinghua os mooc》第15~16讲 处理机调度

    第十五讲 处理机调度 进程调度时机 非抢占系统中,当前进程主动放弃CPU时发生调度,分为两种情况: 进程从运行状态切换到等待状态 进程被终结了 可抢占系统中,中断请求被服务例程响应完成时发生调度,也分 ...

  10. Linux之问题诊断工具strace

    转载于:https://www.cnblogs.com/lidabo/p/4523755.html 引言 “Oops,系统挂死了..." “Oops,程序崩溃了..." “Oops ...