SpringBoot整合 Camunda 流程引擎

2023-06-28  本文已影响0人  上善若泪

1 整合 Camunda 流程引擎

1.1 简介

1.1.1 概念介绍

Camunda 概念:

核心组件:

官方文档:https://docs.camunda.org/manual/7.18/user-guide/process-engine/process-engine-api/
下面是官网的一些文档,有时间可以看看,下面说一些核心的东西。

image.png

1.1.2 组件介绍

ProcessEngine 为流程引擎,可以通过它获取相关service,里面集成了很多相关service,默认实现如下:

image.png

RepositoryService:此服务提供用于管理和操作部署和流程定义的操作,使用camunda的第一要务
RuntimeService:运行相关,启动流程实例、删除、搜索等
TaskService:所有围绕任务相关的操作,如完成、分发、认领等
HistoryService:提供引擎搜集的历史数据服务
IdentityService:用户相关,实际中用不太到

1.2 Springboot集成

1.2.1 pom.xml

需要3个maven依赖,分别是对应 流程引擎、Web管理平台、提供rest api操作接口包

<dependency>
    <groupId>org.camunda.bpm.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter</artifactId>
    <version>7.18.0</version>
</dependency>
<dependency>
    <groupId>org.camunda.bpm.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
    <version>7.18.0</version>
</dependency>
<dependency>
    <groupId>org.camunda.bpm.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
    <version>7.18.0</version>
</dependency>

1.2.2 配置文件

application.yml

## camunda登录信息配置
camunda.bpm:
  admin-user:
    id: admin  ##用户名
    password: 123456  ##密码
    firstName: yu
  filter:
    create: All tasks
 
## mysql连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:8101/camunda
    username: xxxx
    password: xxxx
    type: com.alibaba.druid.pool.DruidDataSource

1.2.3 数据库

使用的是mysql,建新库 camunda(数据库必须是存在的,不然启动不起来),启动后会自动生成所需表结构

启动后自动生成的表结构如下


image.png

大概有这么几个表模块,重要的详细介绍下:

1.2.4 登录界面

登录地址为 http://localhost:8080/,输入用户名密码即为配置文件里面的 admin,123456

image.png

主控制台,登陆成功后,如下所示


image.png

1.3 绘制流程图

1.3.1 下载安装

首先需要一个工具 Camunda Modeler 来画,下载地址:https://camunda.com/download/modeler/

image.png

解压缩后打开如下:


image.png

1.3.2 绘制

新建一个


image.png

其中 BPMNDMNFormCamunda中使用的三种不同的模型和技术。

1.3.2.1 任务分类

只介绍最常用的两种
用户任务 (User Task)具体来说就是需要手动执行的任务,即需要我们这变写完业务代码后,调用代码 taskService.complete(taskId, variables); 才会完成的任务

image.png

系统任务(Service Task)系统会自动帮我们完成的任务


image.png

1.3.2.2 网关

分为这么几类,会根据我们传入的流程变量及设定的条件走


image.png

示例


image.png

如上图包含网关,需要在网关的连线初设置表达式 condition,参数来自于流程变量

两个参数:switch2d 、 switch3d

1.3.2.3 指定key

右侧控制面板中的id就是这个流程的key,可以自定义设定


image.png

1.3.3 集成在idea中

idea中的路径:file -> Setting -> Tools -> External Tools

image.png

这里设置后,选中 bpmn 文件,点击 tools ->External Tools 选中camunda(刚刚上面自己命名的扩展工具的名字),就会打开流程图编辑页面进行操作

image.png

1.3.4 引入项目测试

将画好的流程图保存文件为 test_1.bpmn,在刚才的springboot项目中resources新建一个bpmn文件夹,放进去,

image.png

重启项目,发现web界面中已经被集成进来了


image.png

conttoller

package cn.controller;

import cn.service.TestTaskService;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class TaskController {

    @Autowired
    private TestTaskService testTaskService;

    //开启流程
    @PostMapping("/start/process")
    public void startProcess(){
        testTaskService.startProcess();
    }
    //查询流程定义
    @PostMapping("/find/process")
    public List<ProcessDefinition> findProcess(){
        return testTaskService.findProcesses();
    }
    //查询任务
    @PostMapping("/task")
    public List<Task> findTasks(){
        return testTaskService.findTasks();
    }
}

service

package cn.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestTaskService {

    @Autowired
    private TaskService taskService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private RepositoryService repositoryService;

    public void startProcess() {
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("my_key");
        System.out.println("CaseInstanceId = "+instance.getCaseInstanceId());
        System.out.println("BusinessKey = "+instance.getBusinessKey());
        System.out.println("ProcessDefinitionId = "+instance.getProcessDefinitionId());
        System.out.println("ProcessInstanceId = "+instance.getProcessInstanceId());
        System.out.println("RootProcessInstanceId = "+instance.getRootProcessInstanceId());
        System.out.println("Id = "+instance.getId());
        System.out.println("TenantId = "+instance.getTenantId());
    }

    public List<ProcessDefinition> findProcesses() {
        return repositoryService.createProcessDefinitionQuery().list();
    }

    public List<Task> findTasks() {
        return taskService.createTaskQuery().list();
    }
}

参考链接:https://mp.weixin.qq.com/s/8w1S7Fwqxq_ghlE-z7d5BQ

上一篇下一篇

猜你喜欢

热点阅读