工作流
工作流简介
工作流(Workflow): 工作流就是通过计算机技术对业务流程进行自动化管理。实现多个参与者按照预定的流程去自动执行业务流程。
定义: 通过计算机对业务流程自动化执行管理
主要解决的是: 使在多个参与者之间按照某种预定义的规则自动进行传递文档,信息或任务的过程.从而实现某个预期的业务目标,或者促使此目标的实现
工作流管理系统的目标:
管理工作的流程以确保工作在正确的时间被期望的人员所执行
在自动化进行的业务过程中插入人工的执行和干预
工作流框架:
Activiti,JBPM,OSWorkFlow,WorkFlow
工作流框架底层需要有数据库提供支持
工作流术语
工作流引擎
ProcessEngine 对象: 这是 Activiti 工作的核心.负责生成流程运行时的各种实例及数据,监控和管理流程的运行
BPM
业务流程管理:
是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法
常见商业管理教育如 EMBA,MBA 等均将 BPM 包含在内
BPMN
业务流程建模与标注:
这些图如何组合成一个业务流程图(Business Process Diagram)
讨论 BPMN 的各种的用途:包括以何种精度来影响一个流程图中的模型
BPMN 作为一个标准的价值
BPMN 未来发展的远景
流对象
一个业务流程图有三个流对象的核心元素
事件
一个事件用圆圈来描述,表示一个业务流程期间发生的东西
事件影响流程的流动.一般有一个原因(触发器)或一个影响(结果)
基于它们对流程的影响,有三种事件:开始事件,中间事件,终止事件
活动
用圆角矩形表示,一个流程由一个活动或多个活动组成
条件
条件用菱形表示,用于控制序列流的分支与合并。
可以作为选择,包括路径的分支与合并
内部的标记会给出控制流的类型
Activiti 开源工作流框架
Activiti 简介
Activiti 是一个开源的工作流引擎,它实现了 BPMN 2.0 规范,可以发布设计好的流程定义,并通过 api 进行流程调度
Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速,超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上.每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员.通过使用这些服务,开发人员能够构建出功能丰富,轻便且高效的 BPM 应用程序
Activiti 服务结构
Activiti 系统服务结构图
核心类:
ProcessEngine: 流程引擎的抽象,可以通过此类获取需要的所有服务
服务类:
XxxService: 通过 ProcessEngine 获取,Activiti 将不同生命周期的服务封装在不同 Service 中,包括定义,部署,运行.通过服务类可获取相关生命周期中的服务信息
==RepositoryService==
Repository Service 提供了对 repository 的存取服务
Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如 BPMN2.0XML 文件,表单定义文件,流程定义图像文件等),这些文件都存储在 Activiti 内建的 Repository 中
==RuntimeService==
Runtime Service 提供了启动流程,查询流程实例,设置获取流程实例变量等功能.此外它还提供了对流程部署,流程定义和流程实例的存取服务
==TaskService==
Task Service 提供了对用户 Task 和 Form 相关的操作.它提供了运行时任务查询,领取,完成,删除以及变量设置等功能
==HistoryService==
History Service 用于**获取正在运行或已经完成的流程实例的信息,**与 Runtime Service 中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化
==FormService==
使用 Form Service 可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单
Activiti 中的流程和状态 Task 均可以关联业务相关的数据
==IdentityService==
Identity Service 提供了对 Activiti 系统中的用户和组的管理功能
Activiti 中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的 Task
ManagementService
Management Service 提供了对 Activiti 流程引擎的管理和维护功能
这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护
核心业务对象:
org.activiti.engine.impl.persistence.entity 包下的类,包括 Task,ProcessInstance,Execution 等
根据不同职责实现相应接口的方法(如需要持久化则继承 PersistentObject 接口),与传统的实体类不同
Activiti 组件
==Activiti 上下文组件 Context:== 用来保存生命周期比较长,全局性的信息,类似 Application.主要包括如下三类:
CommandContext: 命令上下文-保存每个命令必要的资源,如持久化需要的 session
ProcessEngineConfigurationImpl: 流程引擎相关配置信息-整个引擎全局的配置信息.如数据源 DataSource 等.该对象为单例,在流程引擎创建的时候初始化
ExecutionContext: 持有 ExecutionEntity 对象
==持久化组件:==
Activiti 使用 mybatis 作 OR 映射,并在此基础上增加设计了自己的持久化框架
在流程引擎创建时初始化,顶层接口 Session,SessionFactory
Session 有两个实现类:
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 方法,因为有新任务而被调用。
流程虚拟机 PVM
流程虚拟机 API 暴露了流程虚拟机的 POJO 核心,流程虚拟机 API 描述了一个工作流流程必备的组件,这些组件包括:
PvmProcessDefinition: 流程的定义,形象点说就是用户画的那个图.静态含义
PvmProcessInstance: 流程实例,用户发起的某个 PvmProcessDefinition 的一个实例.动态含义
PvmActivity: 流程中的一个节点
PvmTransition: 衔接各个节点之间的路径,形象点说就是图中各个节点之间的连接线
PvmEvent: 流程执行过程中触发的事件
Activiti 架构
Activiti Engine:
最核心的模块
提供针对 BPMN 2.0 规范的解析,执行,创建,管理(任务,流程实例),查询历史记录并根据结果生成报表
Activiti Modeler:
模型设计器
适用于业务人员把需求转换为规范流程定义
Activiti Designer:
功能和 Activiti Modeler 类似,同样提供了基于 BPMN 2.0 规范的可视化设计功能,但是目前还没有完全支持 BPMN 规范的定义
可以把业务需求人员用 Signavio 设计的流程定义(XML 格式)导入到 Designer 中,从而让开发人员将其进一步加工成为可以运行的流程定义
Activiti Explorer:
可以用来管理仓库,用户,组,启动流程,任务办理等
此组件使用 REST 风格 API,提供一个基础的设计模型.如果业务简单,也可以直接使用无需开发.还可以作为后台管理员的流程、任务管理系统使用
Activiti REST:
提供 RESTful 风格的服务
允许客户端以 JSON 的方式与引擎的 REST API 交互
通用的协议具有跨平台,跨语言的特性
Activiti 数据库支持
Activiti 的后台由有数据库的支持
所有的表都以 ACT_开头
第二部分是表示表的用途的两个字母标识
用途也和服务的 API 对应
ACT_RE_* : 'RE'表示repository. 这个前缀的表包含了流程定义和流程静态资源(图片,规则...)
ACT_RU_* : 'RU'表示runtime.这些运行时的表, 包含流程实例,任务,变量,异步任务,等运行中的数据.
Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录.这样运行时表可以一直很小速度很快
ACT_ID_* : 'ID'表示identity.这些表包含身份信息, 比如用户,组...
ACT_HI_* : 'HI'表示history.这些表包含历史数据, 比如历史流程实例,变量,任务...
ACT_GE_* :通用数据. 用于不同场景下, 如存放资源文件
复制代码
资源库流程规则表 (ACT_RE_*:'RE'表示 repository. 这个前缀的表包含了流程定义和流程静态资源(图片,规则...))
act_re_deployment 部署信息表
act_re_model 流程设计模型部署表
act_re_procdef 流程定义数据表
复制代码
运行时数据库表 (ACT_RU_*:'RU'表示 runtime.这些运行时的表, 包含流程实例,任务,变量,异步任务,等运行中的数据.Activiti 只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录.这样运行时表可以一直很小速度很快)
act_ru_execution 运行时流程执行实例表
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
act_ru_task 运行时任务节点表
act_ru_variable 运行时流程变量数据表
复制代码
组织机构表 (ACT_ID_* : 'ID'表示 identity.这些表包含身份信息, 比如用户,组...)
act_id_group 用户组信息表
act_id_info 用户扩展信息表
act_id_membership 用户与用户组对应信息表
act_id_user 用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
复制代码
历史数据库表 (ACT_HI_*:'HI'表示 history.这些表包含历史数据, 比如历史流程实例,变量,任务...)
act_hi_actinst 历史节点表
act_hi_attachment 历史附件表
act_hi_comment 历史意见表
act_hi_identitylink 历史流程人员表
act_hi_detail 历史详情表,提供历史变量的查询
act_hi_procinst 历史流程实例表
act_hi_taskinst 历史任务实例表
act_hi_varinst 历史变量表
复制代码
组织机构表 (ACT_GE_*:通用数据. 用于不同场景下, 如存放资源文件)
act_ge_bytearray 二进制数据表
act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录
复制代码
Activiti 配置文件
activiti.cfg.xml: Activiti 核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数
定义数据库配置参数
配置连接池参数
Activiti 特点
数据持久化
Activiti 的设计思想是简洁,快速
瓶颈体现在和数据库交换数据的过程中,针对这一点 Activiti 选择了使 MyBatis,从而可以通过最优的 SQL 语句执行 Command,仅凭如此就能让引擎在速度上保持最高的性能
引擎 service 接口
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上,每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员,通过使用这些服务,开发人员能够构建出功能丰富,轻便且高效的 BPM 应用程序
activiti.cfg.xml 文件为核心配置文件,该配置文件集成在 Spring 的 IOC 容器当中,可以产生 ProcessEngineConfiguration 对象,这个对象就是流程引擎的配置对象
ProcessEngine 对象为流程引擎对象,该对象是工作流业务系统的核心,所有的业务操作都是由这个对象所派生出来的对象实现
Activiti 引擎提供了七大 Service 接口,均通过 ProcessEngine 获取,并且支持链式 API 编程风格
流程设计器
基于 Web 的 Activiti Modeler 流程设计器
IDEA 的 actiBPM 插件
原生支持 Spring
Activiti 原生支持 Spring,可以很轻松地进行 Spring 集成,非常方便管理事务和解析表达式(Expression)
分离运行时与历史数据
Activiti 继承自 jBPM4,在表结构设计方面也遵循运行时与历史数据的分离
这样的设计可以快速读取运行时数据,仅当需要查询历史数据时再从专门的历史数据表中读取.这种设计方式可以大幅提高数据的存取效率,尤其是当数据日积月累时依然能够快速反应
作者:【攻城狮Chova】