背景:

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

定义:

工作流(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. 性能测试-Linux资源监控⽅式

    Linux资源监控⽅式 1. 命令 2. 第三⽅⼯具(nmon) 3. LR(需要安装RPC相应服务包和开启服务)(略)   ⼀.命令 ⽅式 1. top (系统资源管理器) 2. vmstat (查 ...

  2. vue-slicksort拖拽组件

    vue-slicksort拖拽组件 安装 通过npm安装 $ npm install vue-slicksort --save 通过yarn安装 $ yarn add vue-slicksort 插件 ...

  3. zabbix3.4配置windowsAD登录

    转载自:[https://zabbix.com/documentation/3.4/zh/manual/web_interface/frontend_sections/administration/a ...

  4. iOS-登录加密也许用到,反转字符串

    - (NSString *)stringByReversed{//    NSMutableString *s = [NSMutableString string];//    for (NSUInt ...

  5. iOS-UIScrollView+UIPageControl简单实现

    #import "MJViewController.h"#import "RootViewController.h" @interface MJViewCont ...

  6. Docker 镜像的推送(六)

    目录 一.为镜像命名 二.推送到官方 Docker Hub 1.首先得在 Docker Hub 上注册一个账号. 2.在 Docker Host 上登录 3.修改镜像命名 4.镜像上传 5.登录查看上 ...

  7. SpringCloud入门01之基础知识

    一.Spring Cloud 什么是spring cloud, 为什么要使用微服务架构? 参考度娘 Spring Cloud是一系列框架的有序集合, 它利用Spring Boot的开发便利性巧妙地简化 ...

  8. 最新 多益网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 多益网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了 多益网络.6.7月主要是做系统复习.项目复盘.Le ...

  9. 洛谷 题解 P3627 【[APIO2009]抢掠计划】

    图论 tarjan缩点+最短路 的一道题 tarjan求强连通分量(为以后缩点打下良好的基础) (如果不会tarjan的请点击这儿) 你需要的东西: (1).dfn[],表示这个点在dfs时是第几个被 ...

  10. Asp.Net Core 自定义验证属性

    很多时候,在模型上的验证需要自己定义一些特定于我们需求的验证属性.所以这一篇我们就来介绍一下怎么自定义验证属性. 我们来实现一个验证邮箱域名的自定义验证属性,当然,最重要的是需要定义一个继承自Vali ...