一、工作流
1、工作流概述
在一个公司业务中,每一个业务的开始和结束,都可以理解成为一个工作流。例如公司请假的基本流程。
如图所示,员工先提出请假申请,提交该申请给直属领导审批,直属领导审批后,再提交给人事部门审批,审批完成后,通知提出申请的员工,即请假流程结束。整个步骤按照正常工作方式一步步完成,这就是一个简单而又完整的工作流;工作流可以理解为从开始节点发起流程,然后经过其中多个节点,完成动作,最后到结束节点的整个过程。
在没有工作流引擎之前,为了实现上述的流程控制,开发人员最常用的做法是采用状态值跟踪流程的状态变化,假设初始值为0,每一个流程的流转,状态值+1,然后给出相应的处理逻辑。可以看出工作的流程和业务高度耦合,当流程发生变化时,我们的业务代码也要做出同等的调整。
如果有一个工具帮助我们管理工作流,当业务流程变化后,程序不需要发生变化,最终将会让我们的开发能力和业务能力大幅提升。于是乎,工作流引擎应运而生!
二、Activiti介绍
1、简介
- Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度
- Activiti是一种轻量级,可嵌入的BPM引擎,可以将复杂的业务流程抽取出来,然后使用专门的建模语言BPMN2.0定义执行流程,最终业务系统通过访问Activiti的接口去驱动预定义的流程执行
- Activiti 流程引擎重点关注在系统开发的易用性和轻量性上.每一项BPM业务功能Activiti流程引擎都以服务的形式提供给开发人员.通过使用这些服务,开发人员能够构建出功能丰富,轻便且高效的BPM应用程序
2、Activiti服务架构
activiti.cfg.xml:
Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数
核心类:
ProcessEngine: 流程引擎的抽象,可以通过此类获取需要的所有服务
服务类:
- XxxService: 通过ProcessEngine获取,Activiti将不同生命周期的服务封装在不同Service中,包括定义,部署,运行.通过服务类可获取相关生命周期中的服务信息
- RepositoryServiceRepository Service提供了对repository的存取服务 Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如BPMN2.0XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中
- RuntimeServiceRuntime Service提供了启动流程,查询流程实例,设置获取流程实例变量等功能.此外它还提供了对流程部署,流程定义和流程实例的存取服务
- TaskServiceTask Service提供了对用户Task和Form相关的操作.它提供了运行时任务查询,领取,完成,删除以及变量设置等功能
- HistoryServiceHistory Service用于获取正在运行或已经完成的流程实例的信息,与Runtime Service中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化
- FormService使用Form Service可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单 Activiti中的流程和状态Task均可以关联业务相关的数据
- IdentityServiceIdentity Service提供了对Activiti系统中的用户和组的管理功能 Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task
- ManagementServiceManagement Service提供了对Activiti流程引擎的管理和维护功能 这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护
组件
- 持久化组件:
Activiti使用mybatis作OR映射,并在此基础上增加设计了自己的持久化框架在流程引擎创建时初始化,顶层接口Session,SessionFactorySession有两个实现类:DbSqlSession: 负责sql表达式的执行AbstractManager: 负责对象的持久化操作SessionFactory有两个实现类:DbSqlSessionFactory: 负责DbSqlSession相关操作GenericManagerFactory: 负责AbstractManager相关操作
- Event-Listener组件:
Activiti允许客户代码介入流程执行,提供了事件监听组件监听的事件类型:TaskListener、JavaDelegate、Expression、ExecutionListener、ProcessEngineConfigurationImpl持有DelegateInterceptor的某个实例,方便调用handleInvocation
- Cache组件:
DbSqlSession中有cache的实现Activiti基于List和Map来做缓存:如查询时先查缓存,没有则直接查询并放入缓存
- 异步执行组件:
Activiti可以执行任务,JobExecutor为其核心类,JobExecutor包含三个主要属性:JobAcquisitionThread、BlockingQueue、ThreadPoolExecutor,方法ProcessEngines在引擎启动时调用JobExecutor.start,JobAcquisitionThread 线程即开始工作,其run方法不断循环执行AcquiredJobs中的job,执行一次后线程等待一定时间直到超时或者JobExecutor.jobWasAdded方法,因为有新任务而被调用。
- 上下文组件Context:
用来保存生命周期比较长,全局性的信息,类似Application.主要包括如下三类:CommandContext: 命令上下文-保存每个命令必要的资源,如持久化需要的sessionProcessEngineConfigurationImpl: 流程引擎相关配置信息-整个引擎全局的配置信息.如数据源DataSource等.该对象为单例,在流程引擎创建的时候初始化ExecutionContext: 持有ExecutionEntity对象
3、Activiti数据库支持
- 所有的表都以ACT_开头
- 第二部分是表示表的用途的两个字母标识
- 用途也和服务的API对应
资源库流程规则表说明:
运行时数据库表说明:
组织结构表说明:
4、BPM/BPMN介绍
BPM(Business Process Management),即业务流程管理,是一种规范化的构造端到端的业务流程,以持续的提高组织业务效率。常见商业管理教育如EMBA、MBA等均将BPM包含在内。BPMN(Business Process Model AndNotation)即业务流程模型和符号,是一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。Activiti 就是使用 BPMN 进行流程建模、流程执行管理的。BPMN2.0 是业务流程建模符号 2.0 的缩写,它由 Business Process Management Initiative 这个非营利协会创建并不断发展。BPMN2.0 是使用一些符号来明确业务流程设计流程图的一套符号规范,能增进业务建模时的沟通效率。目前 BPMN2.0 是最新的版本,它用于在 BPM 上下文中进行布局和可视化的沟通
BPMN2.0基本符号介绍
简要列表如下:
三、springboot整合Activiti
- 新建springboot项目
- pom.xml导入相关依赖
- 在resource目录下新建process目录作为*.bmnp的存储路径
- application.yml配置
- idea安装插件Activiti BPMN visualizer,创建流程图
打开该文件,右键选中如图:
最终会生成xml文件:
通过读取png和bmnp获取请假流程:
四、考虑使用Activiti的场景
1、关键业务流程: 订单、报价处理、合同审核、客户电话处理、供应链管理等
2、行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等
3、人事管理类: 员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
4、财务相关类: 付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。
5、客户服务类: 客户信息管理、客户投诉、请求处理、售后服务管理等。
五、总结
从公司讲,工作流系统规范了公司的业务流程,优化了企业内部的管理,提高了团队间地协作效率,能够帮助企业向知识型企业转变。
作为技术开发人员,Activiti在小项目中基于串行并行流转能够基本满足业务和开发的需求;但是Activiti对于技术的要求门槛相对较高,二次开发难度大,需要技术人员不断提升和学习,在实战中研发出具有极高价值的工作流系统。