教程一: | 创建camunda项目=>部署流程定义=>创建流程实例=>走完流程实例 |
教程二: | camunda数据库中的48张表分别的大致含义,数据库表结构介绍 |
教程三: | 下载camunda-modeler并将其置为IDEA的外部工具详细过程,且在camunda-modeler中进行绘制流程定义图 |
教程四: | 不使用camunda-modeler,使用Fluent Builder API,代码编写流程定义并部署 |
教程五: | 代码编写流程定义,并自定义创建需要展示的流程图 |
教程(一)学习前提:
①了解bpmn2.0(一种规范)基础知识中的:
startEvent-开始事件,endEvent-结束事件,Task-任务;
②会使用IDEA,以及Maven(JAVA);
1、首先,随便创建一个文件,然后保存下方这个xml文件并更名为:【simpleTest.bpmn20.xml】
Flow_0f563t7
Flow_08w3ufg
Flow_0f563t7
Flow_08w3ufg
在后续教程(教程三)中有详细提到如何在IDEA中添加一个外部工具,即:camunda-modeler。
此处默认已经添加该外部工具。
2、新建一个SpringBoot的maven项目,在pom文件里面添加依赖(依赖非最新,请根据实际情况进行引用),例如:
org.camunda.bpm
camunda-bom
7.18.0
import
pom
/
/
org.camunda.bpm.springboot
camunda-bpm-spring-boot-starter-webapp
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 processDefinitionList = repositoryService.createProcessDefinitionQuery().active().latestVersion().list();
logger.info("> 处于激活状态的最新版本的流程定义数量: " + processDefinitionList.size());
for (ProcessDefinition pd : processDefinitionList) {
logger.info("\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 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等多个表中看到有关此流程实例的相关历史信息