Camunda-热门工作流引擎框架
Lecture:波哥
IDEA引入流程设计器
在工作流引擎中流程设计器是一个非常重要的组件,而InterlliJ IDEA
是Java程序员用到的最多的编程工具了。前面在基础篇的介绍中我们都在通过Camunda提供的流程设计器绘制好流程图,然后需要单独的拷贝到项目中,要是调整修改不是很方便,这时我们可以在IDEA中和流程设计器绑定起来。这样会更加的灵活。
下载Camunda Model
第一步肯定是需要下载Camunda Model
这个流程设计器,我们前面有介绍。就是之前解压好的目录了。
IDEA中配置
我们先进入settings
中然后找到tools
,继续找到External Tool
.
最终效果
编辑bpmn文件
找到您想打开的bpmn文件, 点击右键, 找到External Tools 运行camunda modler即可进行文件编写.
搞定~
SpringBoot整合Camunda
官方案例说明
接下来我们看看怎么在我们的实际项目中来使用Camunda了。方式有多种,首先我们可以参考官网提供的整合案例。
但是这里有个比较头疼的问题就是Camunda和SpringBoot版本的兼容性问题,虽然官方也给出了兼容版本的对照表。
但是如果不小心还是会出现各种问题,比如:
上面就是典型的版本不兼容的问题了。
官方Demo
为了能让我们的案例快速搞定,我们可以通过Camunda官方提供的网站来创建我们的案例程序。地址:https://start.camunda.com/
生成代码后,解压后我们通过idea打开项目,项目结构
相关的pom.xml中的依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boge.workflow</groupId> <artifactId>camunda-project-demo</artifactId> <version>1.0.0-SNAPSHOT</version>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.4.3</version> <type>pom</type> <scope>import</scope> </dependency>
<dependency> <groupId>org.camunda.bpm</groupId> <artifactId>camunda-bom</artifactId> <version>7.15.0</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>org.camunda.bpm.springboot</groupId> <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId> </dependency>
<dependency> <groupId>org.camunda.bpm.springboot</groupId> <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId> </dependency>
<dependency> <groupId>org.camunda.bpm</groupId> <artifactId>camunda-engine-plugin-spin</artifactId> </dependency>
<dependency> <groupId>org.camunda.spin</groupId> <artifactId>camunda-spin-dataformat-all</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
</dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.3</version> </plugin> </plugins> </build>
</project>
|
属性文件的配置信息
1 2 3 4 5
| spring.datasource.url: jdbc:h2:file:./camunda-h2-database
camunda.bpm.admin-user: id: demo password: demo
|
然后通过启动类启动程序
访问服务:http://localhost:8080/
MySQL数据库
上面的例子我们数据存储在了H2这个内存型数据库,我们可以切换到MySQL
数据库。首先我们需要导入相关的SQL脚本。位置就在我们之前下载的Camunda Web
服务中。
执行创建所有必需的表和默认索引的SQL DDL脚本。上面两个脚本都要执行。
生成的相关表结构比较多,因为本身就是基于Activiti演变而来,所以有Activiti基础的小伙伴会非常轻松了。简单介绍下相关表结构的作用。
- ACT_RE :’RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
- ACT_RU:’RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Flowable只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
- ACT_HI:’HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
- ACT_GE: GE 表示 general。 通用数据, 用于不同场景下
- ACT_ID: ’ID’表示identity(组织机构)。这些表包含标识的信息,如用户,用户组,等等。
具体的表结构的含义:
表分类 | 表名 | 解释 |
---|
一般数据 | | |
| [ACT_GE_BYTEARRAY] | 通用的流程定义和流程资源 |
| [ACT_GE_PROPERTY] | 系统相关属性 |
流程历史记录 | | |
| [ACT_HI_ACTINST] | 历史的流程实例 |
| [ACT_HI_ATTACHMENT] | 历史的流程附件 |
| [ACT_HI_COMMENT] | 历史的说明性信息 |
| [ACT_HI_DETAIL] | 历史的流程运行中的细节信息 |
| [ACT_HI_IDENTITYLINK] | 历史的流程运行过程中用户关系 |
| [ACT_HI_PROCINST] | 历史的流程实例 |
| [ACT_HI_TASKINST] | 历史的任务实例 |
| [ACT_HI_VARINST] | 历史的流程运行中的变量信息 |
流程定义表 | | |
| [ACT_RE_DEPLOYMENT] | 部署单元信息 |
| [ACT_RE_MODEL] | 模型信息 |
| [ACT_RE_PROCDEF] | 已部署的流程定义 |
运行实例表 | | |
| [ACT_RU_EVENT_SUBSCR] | 运行时事件 |
| [ACT_RU_EXECUTION] | 运行时流程执行实例 |
| [ACT_RU_IDENTITYLINK] | 运行时用户关系信息,存储任务节点与参与者的相关信息 |
| [ACT_RU_JOB] | 运行时作业 |
| [ACT_RU_TASK] | 运行时任务 |
| [ACT_RU_VARIABLE] | 运行时变量表 |
用户用户组表 | | |
| [ACT_ID_BYTEARRAY] | 二进制数据表 |
| [ACT_ID_GROUP] | 用户组信息表 |
| [ACT_ID_INFO] | 用户信息详情表 |
| [ACT_ID_MEMBERSHIP] | 人与组关系表 |
| [ACT_ID_PRIV] | 权限表 |
| [ACT_ID_PRIV_MAPPING] | 用户或组权限关系表 |
| [ACT_ID_PROPERTY] | 属性表 |
| [ACT_ID_TOKEN] | 记录用户的token信息 |
| [ACT_ID_USER] | 用户表 |
然后我们在SpringBoot项目中导入MySql
的依赖,然后修改对应的配置信息
1 2 3 4
| <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
|
修改application.yaml
。添加数据源的相关信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
camunda.bpm.admin-user: id: demo password: demo spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/camunda1?serverTimezone=Asia/Shanghai username: root password: 123456 camunda: bpm: database: type: mysql schema-update: true auto-deployment-enabled: false
|
然后启动项目,发现数据库中有了相关记录,说明操作成功
Camunda专题讲解
用了整合的基础我们就可以来完成一个流程审批的案例了
部署流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @RestController @RequestMapping("/flow") public class FlowController {
@Autowired private RepositoryService repositoryService;
@GetMapping("/deploy") public String deplopy(){ Deployment deploy = repositoryService.createDeployment() .name("部署的第一个流程") .addClasspathResource("process.bpmn") .deploy(); return deploy.getId() + ":" + deploy.getName(); } }
|
启动后访问接口即可
启动流程
启动流程我们通过单元测试来操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package com.boge.workflow;
import org.camunda.bpm.engine.RepositoryService; import org.camunda.bpm.engine.RuntimeService; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.runtime.ProcessInstance; import org.camunda.bpm.engine.task.Task; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest(classes = Application.class) public class ApplicationTest {
@Autowired private RepositoryService repositoryService;
@Autowired private RuntimeService runtimeService;
@Autowired private TaskService taskService;
@Test public void startFlow(){ ProcessInstance processInstance = runtimeService .startProcessInstanceById("1a880f27-2e57-11ed-80d9-c03c59ad2248"); System.out.println("processInstance.getId() = " + processInstance.getId()); System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId()); }
}
|
查询待办
查询待办也就是查看当前需要审批的任务,通过TaskService来处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
@Test public void queryTask(){ List<Task> list = taskService.createTaskQuery() .taskAssignee("demo1") .list(); if(list != null && list.size() > 0){ for (Task task : list) { System.out.println("task.getId() = " + task.getId()); System.out.println("task.getAssignee() = " + task.getAssignee()); } } }
|
完成任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
@Test public void completeTask(){ Task task = taskService.createTaskQuery() .taskAssignee("demo") .singleResult(); if(task != null ){ taskService.complete(task.getId()); System.out.println("任务审批完成..."); } }
|
好了~到此Camunda的基础入门案例我们就讲解到这里,需要获取更多Camunda相关课程视频的可以继续关注波哥的B账号,或者添加波哥微信(boge_java/boge3306)