准备工作
先下载2个客户端,分别是Camunda Platform和Camunda Modeler
Camunda Platform是用来部署的
Camunda Modeler是用来设计流程的
具体的流程里的实际动作还是需要我们自己写代码去订阅实现的。
直接上官网的2个下载地址,下载后不需要配置环境变量直接就能run,我这边本地pc是windows的所以下载了windows的,运行步骤可以直接看官网文档
Camunda Platform
https://camunda.com/download/
平台登录默认账密
demo/demo
Camunda Modeler
https://camunda.com/download/modeler/
camunda
中几个关键的层次关系
- 流程定义 (Process Definition): 流程定义是对业务流程的蓝图或模板,它是静态的,按照BPMN 2.0规范进行建模。
- 流程实例 (Process Instance):
当流程定义被部署并且启动时,就会创建一个流程实例。流程实例是流程定义的一个具体运行时实例,它反映了流程从开始到结束的实际执行路径和状态。 - 任务 (Tasks) 和 任务实例 (Task Instances): 在流程定义中,可以定义各种类型的用户任务、服务任务、脚本任务等。
每当流程实例到达流程中的某个用户任务节点时,流程引擎会根据流程模型的配置创建对应的任务实例。
任务实例具有生命周期,可以被创建、分配给参与者、完成或取消等。 多个任务实例之间可能存在层次关系,例如:
序列关系:在一个串行流程中,任务A完成后才会触发任务B的创建,这时任务A和任务B存在前后顺序的层次关系。
并行关系:在并行网关处分支的情况下,可能会同时创建多个任务实例,这些任务实例间是并发执行的并行层次关系。 嵌套子流程
(Subprocesses):
子流程也是一个流程实例,它可以有自己的用户任务。在这种情况下,子流程内部的任务实例与父流程实例之间形成嵌套层次关系。 - 多实例 (Multi-instance Tasks): Camunda
BPMN支持任务的多实例特性,允许单个任务节点生成多个实例,例如需要多位员工共同签署的会签任务,每个待签署的个体都会有一个独立的任务实例。
简单设计一个流程
在2者启动之后,打开modler开始demo制造。
双击开始圆圈节点,起个名字,然后鼠标左点击后选择Append task(空白矩形),然后也是双击起个名字,之后点击Append task后选择change type改成service task,最后增加一个end节点。
接着在service task里的Implementation中修改类型为External,给topic起个名字,这个topic名字就是一会我们需要在代码里订阅的。
最后就是部署,然后启动我们的代码。用postman抛个demo数据过去看能不能接收到。
下面用图片描述下上面的流程
1-新建文件
官网用的文档也是这个version 7的,所以我这里就直接创建版本7的了
2命名开始节点
3-创建一个任务并命名
4-修改任务为service task
5-追加结束节点并命名
6-修改刚创建的task类型
7-自定义代码订阅任务节点内容
我这边使用的java
导入依赖
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
直接运行下面这段代码
package com.fchan.worker;
import org.camunda.bpm.client.ExternalTaskClient;
import java.awt.*;
import java.net.URI;
import java.util.logging.Logger;
/**
* ClassName: ChargeCardWorker
* Description:
* date: 2022/11/11 10:18
*
* @author fchen
*/
public class ChargeCardWorker {
private final static Logger LOGGER = Logger.getLogger(ChargeCardWorker.class.getName());
public static void main(String[] args) {
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.asyncResponseTimeout(10000) // 长轮询超时时间
.build();
// 订阅指定的外部任务,task的topic
client.subscribe("task_demo")
.lockDuration(1000) // 默认锁定时间为20秒,这里修改为1秒
.handler((externalTask, externalTaskService) -> {
// 将您的业务逻辑写在这
// 获取流程变量
String item = (String) externalTask.getVariable("item");
Long amount = (Long) externalTask.getVariable("amount");
LOGGER.info("Charging credit card with an amount of '" + amount + "'€ for the item '" + item + "'...");
try {
Desktop.getDesktop().browse(new URI("https://docs.camunda.org/get-started/quick-start/complete"));
} catch (Exception e) {
e.printStackTrace();
}
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
}
}
8-部署流程
9-测试
post请求
http://localhost:8080/engine-rest/process-definition/key/Process_0d1kgby/start
Process_0d1kgby就是刚刚我们流程的id
body内容可以自定义,和我们代码对上即可
{
"variables": {
"amount": {
"value": 555,
"type": "long"
},
"item": {
"value": "item-xyz"
}
}
}
测试成功