工作流引擎activiti从陌生到入门

3 篇文章 0 订阅
2 篇文章 0 订阅

一、创建项目

1.创建一个springboot项目,勾选自己需要的依赖,也可以后期在pom.xml添加

在这里插入图片描述
在这里插入图片描述

引入activiti依赖

<!--activiti-->
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M4</version>
</dependency>
<dependency>
    <groupId>org.activiti.dependencies</groupId>
    <artifactId>activiti-dependencies</artifactId>
    <version>7.1.0.M4</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>

yml配置

server:
  port: 8080

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
    driver-class-name: com.mysql.cj.jdbc.Driver
#activiti配置
  activiti:
    history-level: full
    db-history-used: true
    check-process-definitions: true
2启动项目

自动创建activiti相关数据表,如果未自动创建,在数据库连接后加上&nullCatalogMeansCurrent=true
生成数据表
在这里插入图片描述

act_ge_* 通用表
act_hi_* 历史表
act_re_* 资源表
act_ru _* 运行状态表,实例,任务,变量等等

activiti7部署表bug修复
ALTER TABLE act_re_deployment add COLUMN PROJECT_RELEASE_VERSION_ varchar(255) DEFAULT null;
ALTER TABLE act_re_deployment add COLUMN VERSION_ varchar(255) DEFAULT null;

二、activiti相关概念及操作

activiti架构

获取流程引擎工具

 // 获取默认流程引擎
  ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

ProcessEngine 流程引擎工具
服务接口:下面这些服务类主要用户流程的实现,执行与管理。
在这里插入图片描述
具体使用时可以通过获取流程工具使用,在springboot中也可以直接注入其实现类
在这里插入图片描述

BPMN

定义

bpmn定义了一种业务流程模型标准。通过它可以设计一套业务流程的图形化模型。简而言之,它是业务流程的可视化编辑器。

idea插件

在idea插件官网搜索actiBPM并下载,通过idea插件导入。
使用时输入中文会乱码
乱码修改三个位置
idea安装目录 idea.exe.vmoptions idea64.exe.vmoptions 相关两个文件末尾加上-Dfile.encoding=UTF-8
c盘搜索idea64.exe.vmoptions 末尾加上 -Dfile.encoding=UTF-8
新建bpmn文件,便可以创建业务流程模型了。可以在流程中指定办理人,也可以传一些参数,表单信息等功能,这里是通过模型直接指定办理人。
在这里插入图片描述

流程部署 deployment

流程部署就是将生成好的业务流程模型(BPMN)部署到服务器上去。相关的操作如下

  • 指定流程key
  • 指定流程名称
  • 指定任务处理人
  • 上传bpmn文件,图片
  • 增删改查
  • 查询部署列表与xml文件
    代码实现
@SpringBootTest
class ActivitiDeplomentTests {
    @Autowired
    RepositoryServiceImpl repositoryService;

    @Test
    void addDeployment() {
        // 新增流程部署
        String fileName = "BPMN/work_over_time2.0.bpmn";
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource(fileName)
                .key("work_over_time")
                .name("加班申请")
                .deploy();
        System.out.println(deployment.getVersion());
    }

    @Test
    void listDeployment() {
        /**
         * 查询所有流程部署
         */
        List<Deployment> list = repositoryService.createDeploymentQuery().list();
        list.forEach(item -> {
            System.out.println("流程部署id:" + item.getId() + "-流程部署名称:" + item.getName() + "-流程部署key:" + item.getKey() + "-流程部署版本:" + item.getVersion());
        });

    }


    @Test
    void updateDeployment() {
        /**
         * 更新流程部署
         */
        repositoryService.setDeploymentKey("8a3031a4-7644-11eb-b54e-e0d55e485056","ask2");
    }

}

流程定义 processDefination

流程定义与流程部署的关系,流程定义是流程部署的具体实现。流程部署完成后就生成了一个流程定义,同样key的流程部署,会更据key值的不一样生成不同版本的流程定义,具体使用的时候可能会区分流程定义的版本。(入口)

  • 查询已有流程定义
  • 根据条件key查询流程定义(最常用)
  • 删除流程定义
    代码实现
@SpringBootTest
class ActivitiProcessDefinitionTests {
    @Autowired
    RepositoryServiceImpl repositoryService;

    @Test
    void listDeployment() {
        /**
         * 查询所有流程定义
         */
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
        list.forEach(item -> {
            System.out.println("流程定义id:" + item.getId() +"部署id:" + item.getDeploymentId() + "-流程定义名称:" + item.getName() + "-流程定义key:" + item.getKey() + "-流程定义版本:" + item.getVersion());
        });
    }

    @Test
    void getOneProcessDefinition(){
        /**
         * 流程定义key在bpmn文件的key
         */
        ProcessDefinition ask1 = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").latestVersion().singleResult();
        System.out.println("流程定义id:" + ask1.getId() +"部署id:" + ask1.getDeploymentId() + "-流程定义名称:" + ask1.getName() + "-流程定义key:" + ask1.getKey() + "-流程定义版本:" + ask1.getVersion());
    }

    @Test
    void deleteDeployment() {
        /**
         * 删除流程定义
         */
        repositoryService.deleteDeploymentCascade("29eed94a-7642-11eb-a2a6-e0d55e485056");
        repositoryService.deleteDeploymentCascade("438f67c9-7643-11eb-9bd0-e0d55e485056");
        repositoryService.deleteDeploymentCascade("6e5d2b4a-7646-11eb-bb37-e0d55e485056");
    }

流程实例 processInstance

流程开启时会产生一个流程实例,到当前流程结束之前,该实例会一直存在。

任务操作 task

  • 查询到当前用户的任务
  • 完成任务
  • 历史任务查询
    代码实现
@Test
    void startProcess() {
        // 开始任务,生成流程实例
        runtimeService.startProcessInstanceByKey("work_over_time");
    }

    @Test
    void taskQuery() {
        // 任务查询
        List<Task> taskList = taskService.createTaskQuery().taskAssignee("two").list();
        taskList.forEach(task -> {
            System.out.println("任务名称" + task.getName());
            System.out.println("拥有者" + task.getOwner());
            System.out.println("任务描述" + task.getDescription());
            System.out.println("-------------");
        });
    }

    @Test
    void completeTask() {
        // 完成任务
        // 1.查询请假流程任务(通过流程实例与当前处理者查询)
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("work_over_time")
                .taskAssignee("two")
                .singleResult();
        // 2.完成任务
        taskService.complete(task.getId());
    }

    @Test
    void historyTaskQuery() {
        // 获取默认流程引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

        // 历史任务(已办任务)查询
        List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().taskAssignee("one").list();
        historicTaskInstanceList.forEach(historicTaskInstance -> {
            System.out.println("任务名称:" + historicTaskInstance.getName());
            System.out.println("任务描述:" + historicTaskInstance.getDescription());
            System.out.println("任务持续时间:" + historicTaskInstance.getDurationInMillis() / 1000 / 60 / 60 + "小时");
            System.out.println("-------------");
        });
    }

上面的查询和部署的方式条件都有很多种,这里我展示的只是其中一种,可以通过很多种的组合达到我们查询的要求。

三、总结

我掌握了以下几点

  • 工作流相关的基础概念及其关联(流程部署,流程定义,流程实例,任务)
  • 了解bpmn
  • 流程走的时候对应的数据库的大致的变化(这里未介绍)。
  • 不同的服务接口对应什么功能及其基本的操作需要有 一定的了解。
  • 了解一个任务流程的完整生命周期

工作流其它操作

  • 动态指点办理人
  • 网关
  • 流程变量
  • 表单
  • 复杂流程
    后续一些操作我会慢慢更近学习,也会出几篇文章。最后,附上git地址https://gitee.com/zhoujie1/activiti.git
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值