精明的领带 · mac小鹅通视频下载 - CSDN文库· 3 月前 · |
风度翩翩的伤疤 · 社会学理论_社会学视野网· 1 年前 · |
没有腹肌的水煮肉 · 有哪些小众又高级的礼物? - 小张同学 ...· 1 年前 · |
强悍的柚子 · 《紫心之恋》:评价两极却意外爆红,窜升为Ne ...· 1 年前 · |
Lecture:波哥
在工作流引擎中流程设计器是一个非常重要的组件,而
InterlliJ IDEA
是Java程序员用到的最多的编程工具了。前面在基础篇的介绍中我们都在通过Camunda提供的流程设计器绘制好流程图,然后需要单独的拷贝到项目中,要是调整修改不是很方便,这时我们可以在IDEA中和流程设计器绑定起来。这样会更加的灵活。
第一步肯定是需要下载
Camunda Model
这个流程设计器,我们前面有介绍。就是之前解压好的目录了。
我们先进入
settings
中然后找到
tools
,继续找到
External Tool
.
最终效果
找到您想打开的bpmn文件, 点击右键, 找到External Tools 运行camunda modler即可进行文件编写.
搞定~
接下来我们看看怎么在我们的实际项目中来使用Camunda了。方式有多种,首先我们可以参考官网提供的整合案例。
但是这里有个比较头疼的问题就是Camunda和SpringBoot版本的兼容性问题,虽然官方也给出了兼容版本的对照表。
但是如果不小心还是会出现各种问题,比如:
上面就是典型的版本不兼容的问题了。
为了能让我们的案例快速搞定,我们可以通过Camunda官方提供的网站来创建我们的案例程序。地址:https://start.camunda.com/
生成代码后,解压后我们通过idea打开项目,项目结构
相关的pom.xml中的依赖
<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>
属性文件的配置信息
spring.datasource.url: jdbc:h2:file:./camunda-h2-database
camunda.bpm.admin-user:
id: demo
password: demo
然后通过启动类启动程序
访问服务:http://localhost:8080/
上面的例子我们数据存储在了H2这个内存型数据库,我们可以切换到
MySQL
数据库。首先我们需要导入相关的SQL脚本。位置就在我们之前下载的
Camunda Web
服务中。
执行创建所有必需的表和默认索引的SQL DDL脚本。上面两个脚本都要执行。
生成的相关表结构比较多,因为本身就是基于Activiti演变而来,所以有Activiti基础的小伙伴会非常轻松了。简单介绍下相关表结构的作用。
具体的表结构的含义:
表分类 |
表名 |
解释 |
---|---|---|
一般数据 |
|
|
|
[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
的依赖,然后修改对应的配置信息
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
修改
application.yaml
。添加数据源的相关信息。
# spring.datasource.url: jdbc:h2:file:./camunda-h2-database
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:
database:
type: mysql
schema-update: true
auto-deployment-enabled: false # 自动部署 resources 下的 bpmn文件
然后启动项目,发现数据库中有了相关记录,说明操作成功
用了整合的基础我们就可以来完成一个流程审批的案例了
@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();
}
启动后访问接口即可
启动流程我们通过单元测试来操作
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来处理
/**
* 查询任务
* 待办
* 流程定义ID:processDefinition : 我们部署流程的时候会,每一个流程都会产生一个流程定义ID
* 流程实例ID:processInstance :我们启动流程实例的时候,会产生一个流程实例ID
@Test
public void queryTask(){
List<Task> list = taskService.createTaskQuery()
//.processInstanceId("eff78817-2e58-11ed-aa3f-c03c59ad2248")
.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());
}
/**
* 完成任务
@Test
public void completeTask(){
// 根据用户找到关联的Task
Task task = taskService.createTaskQuery()
//.processInstanceId("eff78817-2e58-11ed-aa3f-c03c59ad2248")
.taskAssignee("demo")
.singleResult();
if(task != null ){
taskService.complete(task.getId());
System.out.println("任务审批完成...");