教程(一)学习前提:
①了解bpmn2.0(一种规范)基础知识中的:
startEvent-开始事件,endEvent-结束事件,Task-任务;
②会使用IDEA,以及Maven(JAVA);
1、首先,随便创建一个文件,然后保存下方这个xml文件并更名为:【simpleTest.bpmn20.xml】
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1pgt2on" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.3.0">
<bpmn:process id="simpleTest" name="simpleTest" isExecutable="true">
<bpmn:startEvent id="StartEvent_1" camunda:initiator="zzx">
<bpmn:outgoing>Flow_0f563t7</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0f563t7" sourceRef="StartEvent_1" targetRef="Activity_1whdatw" />
<bpmn:endEvent id="Event_1xpl0u1">
<bpmn:incoming>Flow_08w3ufg</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_08w3ufg" sourceRef="Activity_1whdatw" targetRef="Event_1xpl0u1" />
<bpmn:userTask id="Activity_1whdatw">
<bpmn:incoming>Flow_0f563t7</bpmn:incoming>
<bpmn:outgoing>Flow_08w3ufg</bpmn:outgoing>
</bpmn:userTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="simpleTest">
<bpmndi:BPMNEdge id="Flow_08w3ufg_di" bpmnElement="Flow_08w3ufg">
<di:waypoint x="360" y="120" />
<di:waypoint x="442" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0f563t7_di" bpmnElement="Flow_0f563t7">
<di:waypoint x="188" y="120" />
<di:waypoint x="260" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1xpl0u1_di" bpmnElement="Event_1xpl0u1">
<dc:Bounds x="442" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0bor2fs_di" bpmnElement="Activity_1whdatw">
<dc:Bounds x="260" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
在后续教程(教程三)中有详细提到如何在IDEA中添加一个外部工具,即:camunda-modeler。
此处默认已经添加该外部工具。
2、新建一个SpringBoot的maven项目,在pom文件里面添加依赖(依赖非最新,请根据实际情况进行引用),例如:
<!-- 在 项目最外层 | 依赖管理的模块 的pom文件中添加该依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- camunda 依赖管理 -->
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-bom</artifactId>
<version>7.18.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
/
/
<!-- 在需要对应依赖的模块,在pom文件中添加下面这个依赖 -->
<dependencies>
<!-- camunda -->
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
</dependency>
<dependencies>
3、根据自身的数据库,选择数据库的依赖,此处略(不懂的网上搜相关依赖添加方法)。
4、在application.yml文件中增添相关内容:
camunda.bpm:
# 流程引擎name
process-engine-name: camundaEngine
# 历史级别
history-level: full
# 是否自动部署
auto-deployment-enabled: false
id-generator: strong
deployment-resource-pattern:
- classpath:processes/*.bpmn20.xml
job-execution:
enabled: true
# database:
# type: postgres
# # 在使用自定义模式和表前缀时,应该手动使用sql脚本创建camunda所需要的的表
# table-prefix: camunda_service.
# jdbc-batch-processing: true
authorization:
enabled: true
admin-user:
id: admin
password: password
spring:
application:
name: camunda-demo
datasource:
# 使用mysql不能自动建表,解决办法:增添nullCatalogMeansCurrent=true,共47张表
url: jdbc:mysql://localhost:3306/camundatest?serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
5、在CamundaTestAppliction文件中修改启动类代码如下:
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class CamundaTestApplication implements CommandLineRunner {
private final Logger logger = LoggerFactory.getLogger(CamundaTestApplication.class);
@Autowired
RepositoryService repositoryService;
public static void main(String[] args) {
SpringApplication.run(CamundaTestApplication.class, args);
}
@Override
public void run(String... args) {
List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery().active().latestVersion().list();
("> 处于激活状态的最新版本的流程定义数量: " + processDefinitionList.size());
for (ProcessDefinition pd : processDefinitionList) {
("\t ===> Process definition: " + pd.getKey() + " 版本:" + pd.getVersion());
}
}
}
6、将之前保存好的bpmn20.xml文件放入如图目录中:
7、在测试类中进行部署:
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleTest {
@Autowired
RepositoryService repositoryService;
// TODO: 2021/1/18 :部署
@Test
public void t1() {
Deployment deployment = repositoryService.createDeployment()
.name("simpleTest")
.addClasspathResource("processes/simpleTest.bpmn20.xml")
.deploy();
System.out.println("部署ID: " + deployment.getId());
System.out.println("部署名称: " + deployment.getName());
System.out.println("————————————————————————————————————————————————————");
}
}
8、开启流程实例:
@Autowired
RuntimeService runtimeService;
// TODO: 2021/1/18 :启动流程实例
@Test
public void t2(){
ProcessInstance simpleTest = runtimeService.startProcessInstanceByKey("simpleTest");
System.out.println("流程实例的ProcessInstanceId: " + simpleTest.getId());
System.out.println("流程实例的ProcessDefinitionId: " + simpleTest.getProcessDefinitionId());
System.out.println("————————————————————————————————————————————————————");
}
9、启动项目启动类CamundaTestApplication,打开浏览器,输入localhost,有可能会进入如下图界面,按照提示输入即可:
有可能直接进入这个界面,直接登录:
登录后,在右上角选择tasklist:
在此处可以看到这个task所处的位置:
10:强制拾取任务并完成任务:
@Autowired
TaskService taskService;
// TODO: 2021/1/18 :(强制)拾取并完成usertask
@Test
public void t3(){
// 获取ProcessInstance的列表
List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery()
.processDefinitionKey("simpleTest")
.active()
.list();
if (processInstanceList.isEmpty()){
throw new RuntimeException("没有流程实例!");
}
// 只获取一个流程实例进行(强制)拾取并完成操作
ProcessInstance processInstance = processInstanceList.get(0);
// 查询task
Task task = taskService.createTaskQuery()
.processInstanceId(processInstance.getId())
.active()
.singleResult();
// 强制拾取操作
taskService.setAssignee(task.getId(),"user");
// 完成操作
taskService.complete(task.getId());
}
11、再回到浏览器tasklist中,可以看到此task消失了,代表走完了这个流程实例,此时可以在数据库中act_hi_procinst等多个表中看到有关此流程实例的相关历史信息