Activiti流程之路

Spring Boot集成Activiti

一、何为activiti?
activiti介绍 Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,
易扩展的可执行流程语言框架。

二、核心7大接口、28张表

1、七大接口
dFvWFA.png

RepositoryService:提供一系列管理流程部署和流程定义的API。
RuntimeService:在流程运行时对流程实例进行管理与控制。
TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
ManagementService:提供对流程引擎进行管理和维护的服务。
HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
FormService:表单服务。

2、二十八张表
dFv2od.png

act_ge_* 通用数据表,ge是general的缩写
act_hi_* 历史数据表,hi是history的缩写,对应HistoryService接口
act_id_* 身份数据表,id是identity的缩写,对应IdentityService接口
act_re_* 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
act_ru_* 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据

3、表结构详解
3.1:资源库流程规则表
1) act_re_deployment 部署信息表
2) act_re_model 流程设计模型部署表
3) act_re_procdef 流程定义数据表

3.2:运行时数据库表 
    1) act_ru_execution 运行时流程执行实例表
        注:1、如果是单例流程(没有分支和聚合),则流程实例id(PROC_INST_ID)就是(等于)执行对象id(ID_) 
            2、一个流程只有一个流程实例,但执行对象可以有多个
    2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 
    3) act_ru_task 运行时任务节点表 
    4) act_ru_variable 运行时流程变量数据表 

3.3:历史数据库表 
    1) act_hi_actinst 历史节点表 
    2) act_hi_attachment 历史附件表 
    3) act_ih_comment 历史意见表 
    4) act_hi_identitylink 历史流程人员表 
    5) act_hi_detail 历史详情表,提供历史变量的查询 
    6) act_hi_procinst 历史流程实例表 
    7) act_hi_taskinst 历史任务实例表 
    8) act_hi_varinst 历史变量表 

3.4:组织机构表 
    1) act_id_group 用户组信息表 
    2) act_id_info 用户扩展信息表 
    3) act_id_membership 用户与用户组对应信息表 
    4) act_id_user 用户信息表 
    这四张表使用很少,相当于一套简单的rbac框架,但很难满足我们的需求所以很少使用

3.5:通用数据表 
    1) act_ge_bytearray 二进制数据表 
    2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录

4、表分类
4.1:流程部署相关表
act_re_deployement 部署对象表
act_rep_procdef 流程定义表
act_ge_bytearray 资源文件表
act_ge_prperty 主键生成策略表(对于部署对象表的主键ID)

4.2:流程实例相关表
     act_ru_execution 正在执行的执行对象表(包含执行对象ID和流程实例ID,如果有多个线程可能流程实例ID不一样)
     act_hi_procinst 流程实例历史表
     act_hi_actinst 存放历史所有完成的任务

4.3:Task 任务相关表
     act_ru_task 代办任务表 (只对应节点是UserTask的)
     act_hi_taskinst 代办任务历史表 (只对应节点是UserTask的) 
     act_hi_actinst  所有节点活动历史表 (对应流程的所有节点的活动历史,从开始节点一直到结束节点中间的所有节点的活动都会被记录)

4.4:流程变量表
     act_ru_variable 正在执行的流程变量表
     act_hi_variable 流程变量历史表

5、activiti配置文件简述
5.1:命名
activiti.cfg.xml

5.2:定义数据库配置参数: 
    jdbcUrl: 数据库的JDBC URL。 
    jdbcDriver: 对应不同数据库类型的驱动。 
    jdbcUsername: 连接数据库的用户名。 
    jdbcPassword: 连接数据库的密码。 

5.3:基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池
    jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。 
    jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。 
    jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 默认为20000(20秒)。 
    jdbcMaxWaitTime: 这是一个底层配置,让连接池可以在长时间无法获得连接时, 打印一条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。 默认为20000(20秒)。

三、activiti必备插件(集成idea)
方法一、在idea插件市场搜索:actibpm,安装重启即可。
方法二、在浏览器搜索idea插件官网,下载actibpm插件,再导入到idea即可。
方法三、链接: https://pan.baidu.com/s/1UWvxxsdT_A8DSxWC_akSpA 提取码: 5ax5,下载后导入idea即可。

四、集成SpringBoot
1、导入依赖

org.activiti
activiti-spring-boot-starter-basic
6.0.0

2、配置 application.yml
    spring: 
     activiti:
      # 自动检查、部署流程定义文件
      check-process-definitions: false
      # 自动更新数据库结构,第一次生成表后改为false
      database-schema-update: false
      # 保存历史数据级别设置为full最高级别,便于历史数据的追溯
      history-level: full
      # 流程定义文件存放目录
      process-definition-location-prefix: classpath:/processes/
      #async-executor-activate: false
      #job-executor-activate: false

    注:databaseSchemaUpdate配置项可以设置流程引擎启动和关闭时数据库执行的策略,有如下四个值: 
        false:默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
        true:Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
        create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
        drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。
    结论:database-schema-update开始设置为true,表创建好之后停止应用。再设为false,不再改变表的结构。
          将check-process-definitions的值设为false,来阻止应用启动检查Activiti数据表是否存在及版本号是否匹配,从而提升应用启动速度

3、解決工作流生成图片乱码问题
    1、新建一个类(可省略)
        package com.kang.activiti.process;

        import org.activiti.spring.SpringProcessEngineConfiguration;
        import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
        import org.springframework.context.annotation.Configuration;

        @Configuration
        public class processEngineConfiguration implements ProcessEngineConfigurationConfigurer{

            /**
             * 解決工作流生成图片乱码问题
             *
             * @param processEngineConfiguration processEngineConfiguration
             */
            @Override
            public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
                processEngineConfiguration.setActivityFontName("宋体");
                processEngineConfiguration.setAnnotationFontName("宋体");
                processEngineConfiguration.setLabelFontName("宋体");
            }
        }
    2、修改/idea/bin目录下的idea.exe.vmoptions和idea64.exe.vmoptions文件,在文件最后添加 -Dfile.encoding=UTF-8

五、设计流程定义图
1、由于idea对于bpmn的设计并不是很友好,所以使用扩展工具来设计流程图
2、下载链接:https://camunda.com/download/modeler/
3、dFOlRK.png
dFOQG6.png
4、当然也可以直接打开下载解压后的可执行文件进行流程图的设计。
5、camunda-modeler具体使用请看:

六、HelloWorld入门
package com.kang.activiti.process;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class Demo1 {

    /**
     * 获取七大接口
     */
    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private IdentityService identityService;

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private ProcessEngine processEngine;

    @Autowired
    private HistoryService historyService;

    //ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**
     * 1.通过定义好的流程图文件部署,一次只能部署一个流程
     * act_ge_bytearray   act_re_deployment   act_re_procdef
     */
    @Test
    public void deploy(){
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("process/hello.bpmn")
                .addClasspathResource("process/hello.png")
                .deploy();
        System.out.println("流程部署id" + deployment.getId());
        System.out.println("流程部署Name" + deployment.getName());
    }

    /**
     * 2.启动流程实例
     * act_hi_actinst  act_hi_identitylink   act_hi_taskinst  act_ru_execution  act_ru_identitylink  act_ru_task
     */
    @Test
    public void start(){
        ProcessInstance pi = runtimeService
                .startProcessInstanceByKey("myProcess_1");
        System.out.println("流程实例id" + pi.getId());
        System.out.println("流程部署Name" + pi.getName());
    }

    /**
     * 3.查看个人任务
     */
    @Test
    public void findTask(){
        List<Task> list = taskService
                .createTaskQuery()
                .taskAssignee("王五")//指定某人
                .list();
        for (Task task : list){
            System.out.println("任务id" + task.getId());
            System.out.println("任务name" + task.getName());
            System.out.println("任务创建时间" + task.getCreateTime());
            System.out.println("委派人name" + task.getAssignee());
            System.out.println("流程实例name" + task.getProcessInstanceId());
        }
    }

    /**
     * 4.完成任务
     */
    @Test
    public void compeleTask(){
        taskService.complete("27502");
        System.out.println("完成任务");
    }
}

   转载规则


《Activiti流程之路》 kang 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录