activiti 基础
一:activiti 入门
工作流(Workflow)
就是业务过程的部分或整体在计算机应用环境下的自动化
主要解决的是“使在多个参与者之间按照某种定义的规则传递文档,信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”
工作流管理系统(WFMS)
是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境
工作流管理系统的目标
管理工作的流程以确保工作在正确的时间被期望的人员所执行——在自动化进行的业务过程中插入人工的执行和干预
Activiti 介绍
Activiti5 是由 Alfresco 软件在 2010 年 5 月 17 日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti 基于 Apache 许可的开源 BPM 平台,创始人 Tom Baeyens 是 JBoss jBPM 的项目架构师,它特色是提供了 eclipse 插件,开发人员可以通过插件直接绘画出业务
工作流引擎
ProcessEngine 对象,这是 Activiti 工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
BPMN
业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
核心配置文件
```{bash}
activiti.cfg.xml
1 xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 4 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 5 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 6
看到这里不得不感叹一下 spring 的强大,整合了 java 半壁江山
数据库
初始化数据库
方法一:
1 //创建工作流需要的数据库 2 @Test 3 public void createTable(){ 4 ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); 5 configuration.setJdbcDriver("com.mysql.jdbc.Driver"); 6 configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti"); 7 configuration.setJdbcUsername("root"); 8 configuration.setJdbcPassword("12345678"); 9 10 /** 11 public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自动创建表,需要表存在 12 public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先删除表再创建表 13 public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表 14 */ 15 configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); 16 //工作流的核心对象,ProcessEnginee对象 17 ProcessEngine processEngine = configuration.buildProcessEngine(); 18 System.out.println("processEngine:"+processEngine); 19 }
方法二: 由于方法一要有代码比较麻烦,所以有配置文件替代:
activiti.cfg.xml
1 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 4 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 5 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 6 7 8 9
1 /**使用配置文件创建工作流需要的23张表*/ 2 @Test 3 public void createTable_2(){ 4 // ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); 5 // //工作流的核心对象,ProcessEnginee对象 6 // ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine(); 7 8 ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") // 9 .buildProcessEngine(); 10 System.out.println("processEngine:"+processEngine); 11 }
Activiti 用来存放流程数据一共使用了 23 张表 都是以 Act_ 开头的 底层操作使用的 mybatis 操作
工作流 Activiti 的表是用来存储流程数据的 而业务数据都需要用户自己创建和维护 一定要让业务去关联流程 才能关联工作流系统
API
流程引擎 ProcessEngine 对象
在 Activiti 中最核心的类,其他的类都是由他而来。 由流程引擎 ProcessEngine 对象创建各个 Service, 这些 Service 是调用工作流 23 张表的服务
RepositoryService 管理流程定义
RuntimeService 执行管理,包括启动,推进,删除流程实例等操作
TaskService 任务管理
HistoryService 历史管理(执行完的数据的管理)
IdentityService 组织机构管理
FormService 一个可选服务,任务表单管理
ManagerService
流程的执行过程
1 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 2 /**部署流程定义*/ 3 @Test 4 public void deploymentProcessDefinition(){ 5 6 Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service 7 .createDeployment()//创建一个部署对象 8 .name("helloworld入门程序")//添加部署的名称 9 .addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载,一次只能加载一个文件 10 .addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载,一次只能加载一个文件 11 .deploy();//完成部署 12 System.out.println("部署ID:"+deployment.getId());//1 13 System.out.println("部署名称:"+deployment.getName());//helloworld入门程序 14 } 15 /**启动流程实例*/ 16 @Test 17 public void startProcessInstance(){ 18 //流程定义的key 19 String processDefinitionKey = "helloword"; 20 ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service 21 .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动 22 System.out.println("流程实例ID:"+pi.getId());//流程实例ID 101 23 System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID helloworld:1:4 24 } 25 26 /**查询当前人的个人任务*/ 27 @Test 28 public void findMyPersonalTask(){ 29 String assignee = "张三"; 30 List list = processEngine.getTaskService()//与正在执行的任务管理相关的Service 31 .createTaskQuery()//创建任务查询对象 32 .taskAssignee(assignee)//指定个人任务查询,指定办理人 33 .list(); 34 if(list!=null && list.size()>0){ 35 for(Task task:list){ 36 System.out.println("任务ID:"+task.getId()); 37 System.out.println("任务名称:"+task.getName()); 38 System.out.println("任务的创建时间:"+task.getCreateTime()); 39 System.out.println("任务的办理人:"+task.getAssignee()); 40 System.out.println("流程实例ID:"+task.getProcessInstanceId()); 41 System.out.println("执行对象ID:"+task.getExecutionId()); 42 System.out.println("流程定义ID:"+task.getProcessDefinitionId()); 43 System.out.println("########################################################"); 44 } 45 } 46 } 47 48 /**完成我的任务*/ 49 @Test 50 public void completeMyPersonalTask(){ 51 //任务ID 52 String taskId = "204"; 53 processEngine.getTaskService()//与正在执行的任务管理相关的Service 54 .complete(taskId); 55 System.out.println("完成任务:任务ID:"+taskId); 56 }
二:Activiti 数据库表结构
1:简单概述:
1 /* 2 Execution 执行对象 3 按流程定义的规则执行一次的过程. 4 对应的表: 5 act_ru_execution: 正在执行的信息 6 act_hi_procinst:已经执行完的历史流程实例信息 7 act_hi_actinst:存放历史所有完成的活动 8 ProcessInstance 流程实例 9 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有 1 个。 10 注意 11 (1)如果是单例流程,执行对象 ID 就是流程实例 ID 12 (2)如果一个流程有分支和聚合,那么执行对象 ID 和流程实例 ID 就不相同 13 (3)一个流程中,流程实例只有 1 个,执行对象可以存在多个。 14 Task 任务 15 执行到某任务环节时生成的任务信息。 16 对应的表: 17 act_ru_task:正在执行的任务信息 18 act_hi_taskinst:已经执行完的历史任务信息 19 20 */
2:activiti5.13 框架 数据库设计说明书
作者:liangjunjie
1、结构设计
1.1、 逻辑结构设计
Activiti 使用到的表都是 ACT_ 开头的。
ACTRE:
’RE’表示 repository(存储),RepositoryService 接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
ACTRU:
‘RU’表示 runtime,运行时表 -RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
ACTID:
’ID’表示 identity (组织机构),IdentityService 接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。
ACTHI:
’HI’表示 history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等
ACTGE:
全局通用数据及设置 (general),各种情况都使用的数据。
1.2、 所有表的含义
序号 | 表名 | 说明 |
1 | act_ge_bytearray | 二进制数据表 |
2 | act_ge_property | 属性数据表存储整个流程引擎级别的数据, 初始化表结构时,会默认插入三条记录, |
3 | act_hi_actinst | 历史节点表 |
4 | act_hi_attachment | 历史附件表 |
5 | act_hi_comment | 历史意见表 |
6 | act_hi_identitylink | 历史流程人员表 |
7 | act_hi_detail | 历史详情表,提供历史变量的查询 |
8 | act_hi_procinst | 历史流程实例表 |
9 | act_hi_taskinst | 历史任务实例表 |
10 | act_hi_varinst | 历史变量表 |
11 | act_id_group | 用户组信息表 |
12 | act_id_info | 用户扩展信息表 |
13 | act_id_membership | 用户与用户组对应信息表 |
14 | act_id_user | 用户信息表 |
15 | act_re_deployment | 部署信息表 |
16 | act_re_model | 流程设计模型部署表 |
17 | act_re_procdef | 流程定义数据表 |
18 | act_ru_event_subscr | throwEvent、catchEvent 时间监听信息表 |
19 | act_ru_execution | 运行时流程执行实例表 |
20 | act_ru_identitylink | 运行时流程人员表,主要存储任务节点与参与者的相关信息 |
21 | act_ru_job | 运行时定时任务数据表 |
22 | act_ru_task | 运行时任务节点表 |
23 | act_ru_variable | 运行时流程变量数据表 |
2、 表以及索引信息
2.1 二进制数据表(act_gebytearray)
2.1.1 简要描述
保存流程定义图片和 xml、Serializable(序列化)的变量, 即保存所有二进制数据,特别注意类路径部署时候,不要把 svn 等隐藏文件或者其他与流程无关的文件也一起部署到该表中,会造成一些错误(可能导致流程定义无法删除)。
2.1.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID | nvarchar(64) | √ | 主键 ID | |
REV | 乐观锁 | int | √ | Version(版本) | |
NAME_ | 名称 | nvarchar(255) | √ | 部署的文件名称,如:mail.bpmn、mail.png 、mail.bpmn20.xml | |
DEPLOYMENTID | 部署 ID | nvarchar(64) | √ | 部署表 ID | |
BYTES | 字节 | varbinary(max) | √ | 部署文件 | |
GENERATED | 是否是引擎生成 | tinyint | √ | 0 为用户生成 1 为 Activiti 生成 |
2.1.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | ID_ | Unique | 主键唯一索引 |
ACT_FK_BYTEARR_DEPL | DEPLOYMENTID |
2.2 属性数据表( act_geproperty )
2.2.1 简要描述
属性数据表。存储整个流程引擎级别的数据。
2.2.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
NAME | 名称 | nvarchar(64) | √ | schema.version | |
schema.history | |||||
next.dbid | |||||
VALUE_ | 值 | nvarchar(300) | √ | 5 | |
create(5.*) | |||||
REV | 乐观锁 | int | √ | version |
2.2.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | NAME | Unique | 主键唯一索引 |
2.3 历史节点表(act_hi_actinst)
2.3.1 简要描述
历史活动信息。这里记录流程流转过的所有节点,与 HITASKINST 不同的是,taskinst 只记录 usertask 内容
2.3.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID_ | nvarchar(64) | √ | ||
PROC_DEFID | 流程定义 ID | nvarchar(64) | |||
PROC_INSTID | 流程实例 ID | nvarchar(64) | |||
EXECUTIONID | 执行实例 ID | nvarchar(64) | |||
ACTID | 节点 ID | nvarchar(225) | 节点定义 ID | ||
TASKID | 任务实例 ID | nvarchar(64) | √ | 任务实例 ID 其他节点类型实例 ID 在这里为空 | |
CALL_PROC_INSTID | 调用外部的流程实例 ID | nvarchar(64) | √ | 调用外部流程的流程实例 ID' | |
ACTNAME | 节点名称 | nvarchar(225) | √ | 节点定义名称 | |
ACTTYPE | 节点类型 | nvarchar(225) | 如 startEvent、userTask | ||
ASSIGNEE_ | 签收人 | nvarchar(64) | √ | 节点签收人 | |
STARTTIME | 开始时间 | datetime | 2013/9/15 11:30 | ||
ENDTIME | 结束时间 | datetime | √ | 2013/9/15 11:30 | |
DURATION | 耗时 | numeric(19,0) | √ | 毫秒值 |
2.3.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | ID | Unique | 主键唯一索引 |
ACT_IDX_HI_ACT_INST_START | STARTTIME | ||
ACT_IDX_HI_ACT_INST_END | ENDTIME | ||
ACT_IDX_HI_ACT_INST_PROCINST | PROC_INSTID 、 ACTID | ||
ACT_IDX_HI_ACT_INST_EXEC | EXECUTIONID 、 ACTID |
2.4 历史附件表( act_hiattachment )
2.4.1 简要描述
历史附件表。
2.4.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID | nvarchar(64) | √ | 主键 ID | |
REV | 乐观锁 | integer | √ | Version | |
USERID | 用户 ID | nvarchar(255) | √ | 用户 ID | |
NAME | 名称 | nvarchar(255) | √ | 附件名称 | |
DESCRIPTION | 描述 | nvarchar(4000) | √ | 描述 | |
TYPE_ | 类型 | nvarchar(255) | √ | 附件类型 | |
TASKID | 任务实例 ID | nvarchar(64) | √ | 节点实例 ID | |
PROC_INSTID | 流程实例 ID | nvarchar(64) | √ | 流程实例 ID | |
URL | URL | nvarchar(4000) | √ | 附件地址 | |
CONTENTID | 字节表的 ID | nvarchar(64) | √ | ACT_GEBYTEARRAY 的 ID |
2.4.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | ID | Unique | 主键唯一索引 |
2.5 历史意见表( act_hicomment )
2.5.1 简要描述
历史意见表。
2.5.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID | nvarchar(64) | √ | 主键 ID | |
TYPE | 类型 | nvarchar(255) | √ | 类型:event(事件) | |
comment(意见) | |||||
TIME_ | 时间 | datetime | 填写时间 ' | ||
USERID | 用户 ID | nvarchar(64) | √ | 填写人 | |
TASKID | 节点任务 ID | nvarchar(64) | √ | 节点实例 ID | |
PROC_INSTID | 流程实例 ID | nvarchar(255) | √ | 流程实例 ID | |
ACTION | 行为类型 | nvarchar(64) | √ | 见备注 1 | |
MESSAGE | 基本内容 | nvarchar(4000) | √ | 用于存放流程产生的信息,比如审批意见 | |
FULLMSG | 全部内容 | varbinary(max) | √ | 附件地址 |
2.5.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | ID_ | Unique | 主键唯一索引 |
2.6 历史详情表( act_hidetail )
2.6.1 简要描述
历史详情表:流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。
2.6.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID | nvarchar(64) | √ | 主键 | |
TYPE | 类型 | nvarchar(255) | 见备注 2 | ||
PROC_INSTID | 流程实例 ID | nvarchar(64) | √ | 流程实例 ID | |
EXECUTIONID | 执行实例 ID | nvarchar(64) | √ | 执行实例 ID | |
TASKID | 任务实例 ID | nvarchar(64) | √ | 任务实例 ID | |
ACT_INSTID | 节点实例 ID | nvarchar(64) | √ | ACT_HIACTINST 表的 ID | |
NAME | 名称 | nvarchar(255) | 名称 | ||
VARTYPE | 参数类型 | nvarchar(255) | √ | 见备注 3 | |
REV | 乐观锁 | int | √ | Version | |
TIME | 时间戳 | datetime | 创建时间 | ||
BYTEARRAYID | 字节表 ID | nvarchar | √ | ACT_GEBYTEARRAY 表的 ID | |
DOUBLE | DOUBLE | double precision | √ | 存储变量类型为 Double | |
LONG | LONG | numeric | √ | 存储变量类型为 long | |
TEXT | TEXT | nvarchar | √ | 存储变量值类型为 String | |
TEXT2 | TEXT2 | nvarchar | √ | 此处存储的是 JPA 持久化对象时,才会有值。此值为对象 ID |
2.6.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
组成字段名称 | 索引类型 | 索引说明 | |
PRIMARY | ID | Unique | 主键唯一索引 |
ACT_IDX_HI_ACT_INST_START | STARTTIME | ||
ACT_IDX_HI_ACT_INST_END | ENDTIME | ||
ACT_IDX_HI_ACT_INST_PROCINST | PROC_INSTID 、 ACTID | ||
ACT_IDX_HI_ACT_INST_EXEC | EXECUTIONID 、 ACTID |
2.7 历史流程人员表( act_ruidentitylink )
2.7.1 简要描述
任务参与者数据表。主要存储历史节点参与者的信息。
2.7.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID | nvarchar(64) | √ | ID | |
GROUPID | 组 ID | nvarchar(255) | √ | 组 ID | |
TYPE_ | 类型 | nvarchar(255) | √ | 备注 4 | |
USERID | 用户 ID | nvarchar(255) | √ | 用户 ID | |
TASKID | 节点实例 ID | nvarchar(64) | √ | 节点实例 ID | |
PROC_INSTID | 流程实例 ID | nvarchar(64) | √ | 流程实例 ID |
2.7.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | ID_ | Unique | 主键唯一索引 |
ACT_IDX_HI_IDENT_LNK_USER | USERID | Unique | |
ACT_IDX_HI_IDENT_LNK_TASK | TASKID | ||
ACT_IDX_HI_IDENT_LNK_PROCINST | PROC_INSTID |
2.8 历史流程实例表(act_hiprocinst)
2.8.1 简要描述
历史流程实例表。
2.8.2 表结构说明
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID | ID_ | nvarchar(64) | √ | 主键 ID | |
PROC_INSTID | 流程实例 ID | nvarchar(64) | 流程实例 ID | ||
BUSINESSKEY | 业务主键 | nvarchar(255) | √ | 业务主键,业务表单的 ID | |
PROC_DEFID | 流程定义 ID | nvarchar(64) | 流程定义 ID | ||
STARTTIME | 开始时间 | datetime | 开始时间 | ||
ENDTIME | 结束时间 | datetime | √ | 结束时间 | |
DURATION_ | 耗时 | Numeric(19) | √ | 耗时 | |
START_USERID | 起草人 | nvarchar(255) | √ | 起草人 | |
START_ACTID | 开始节点 ID | nvarchar(255) | √ | 起草环节 ID | |
END_ACTID | 结束节点 ID | nvarchar(255) | √ | 结束环节 ID | |
SUPER_PROCESS_INSTANCEID | 父流程实例 ID | nvarchar(64) | √ | 父流程实例 ID | |
DELETEREASON | 删除原因 | nvarchar(4000) | √ | 删除原因 |
2.8.3 索引说明
索引名称 | 组成字段名称 | 索引类型 | 索引说明 |
PRIMARY | ID_ | Unique | 主键唯一索引 |
PROC_INSTID | PROC_INSTID | Unique | 外键 |
ACT_UNIQ_HI_BUS_KEY | PROC_DEFID,BUSINESSKEY | Unique | |
ACT_IDX_HI_PRO_INST_END | ENDTIME | ||
ACT_IDX_HI_PRO_I_BUSKEY | BUSINESSKEY |
2.9 历史任务实例表( act_hitaskinst )
2.9.1 简要描述
历史任务实例表。
2.9.2 表结构说明
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/