camunda快速入门(二):设计并执行第一个BPMN流程
二、设计并执行第一个BPMN流程
在本节中,您将学习如何使用 Camunda Modeler 创建您的第一个 BPMN 2.0 流程,以及如何执行自动化步骤。
首先打开 Camunda Modeler。
1、创建BPMN流程
通过单击 File > New File > BPMN Diagram (Camunda Platform) 创建新的 BPMN 图。
1.1、从一个简单的流程开始
首先对一个简单的流程进行建模。
双击 Start Event。将打开一个文本框。将启动事件命名为“Payment Retrieval requested”。
提示
编辑标签时,可以使用添加换行符。Shift + Enter
单击启动事件。从其上下文菜单中,选择活动形状(圆角矩形)。它将自动放置在画布上,您可以将其拖动到您喜欢的位置。将其命名为 Charge Credit Card。通过单击活动形状并使用扳手按钮将活动类型更改为服务任务。
添加名为 Payment Received 的结束事件。
1.2、配置服务任务
使用Camunda平台执行服务任务的方法有很多种。在本指南中,我们将使用外部任务模式。在 Camunda Modeler 中打开属性面板,然后单击您刚刚创建的服务任务。将 Implementation 更改为 and use as the Topic。
1.3、配置执行属性
由于我们正在对可执行进程进行建模,在画布的右侧,您可以找到属性面板,单击建模画布上的空白区域时,属性面板将显示进程本身的属性。
首先,为进程配置 ID。在属性字段 Id 中键入 payment-retrieval。进程引擎将属性 ID 用作可执行进程的标识符,最佳做法是将其设置为人类可读的名称。
其次,配置进程的名称。在属性字段 Name 中键入 Payment Retrieval。
最后,确保选中“可执行文件”属性旁边的框。如果不选中此框,则流程引擎将忽略流程定义。
1.4、保存 BPMN 图
完成后,通过单击“文件”>“另存为...”来保存更改。在出现的对话框中,导航到您选择的文件夹,并将图表另存为payment.bpmn
流程图BPMN模型下载地址:https://github.com/camunda/camunda-get-started-quickstart/archive/Step-1.zip
2、实现外部任务辅助角色
在对流程进行建模后,我们想要执行一些业务逻辑。
Camunda 平台的构建是为了让您的业务逻辑可以用不同的语言实现。您可以选择哪种语言最适合您的项目。
在本快速入门中,我们将向您展示如何在以下位置使用 Camunda 的现成任务客户端:
Java或者JavaScript (NodeJS),根据你熟悉的开发语言情况,选择其中之一即可。
如果您以前从未使用过 Java,我们建议在本教程中使用 JavaScript (NodeJS) 任务客户端。
如果您更喜欢其他编程语言,还可以使用 Camunda 的 REST API 通过 HTTP 访问 API 操作。
2.1、使用 Java开发外部任务
在本节中,您将学习如何在 Java 中实现外部任务工作线程。
2.1.1、先决条件
请确保已安装以下工具:
- JDK 1.8版本
- 用于 Java 项目的 IDE(例如 Eclipse)
2.1.2、创建新的 Maven 项目
首先在 IDE 中创建一个新的 Maven 项目。如果您使用的是 Eclipse,则可以按照以下步骤操作:
在 Eclipse 中,转到“文件”/“新建”/“其他...”。这将打开“新建项目向导”。在“新建项目向导”中,选择“Maven”/“Maven 项目”。单击“下一步”。
在“新建 Maven 项目向导”的第一页上,选择“创建简单项目”(可以跳过原型选择)。单击“下一步”。
在第二页(见屏幕截图)上,配置项目的 Maven 坐标。由于我们正在设置 JAR 项目,因此请确保选择 Packaging: jar。
完成后,单击“完成”。Eclipse 将建立一个新的 Maven 项目。项目将显示在“项目资源管理器视图”中。
2.1.3、添加 Camunda 外部任务客户端依赖项
下一步包括为新流程应用程序设置 Maven 对外部任务客户机的依赖关系。项目的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>org.camunda.bpm.getstarted</groupId>
<artifactId>charge-card-worker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<camunda.external-task-client.version>7.19.0</camunda.external-task-client.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>${camunda.external-task-client.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>jdk9-plus</id>
<activation><jdk>(1.8,)</jdk></activation>
<dependencies>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</profile>
</profiles>
</project>
2.1.4、添加 Java 类
接下来,我们将创建一个订阅该主题的新 ExternalTaskClient。charge-card
当进程引擎遇到配置为外部处理的服务任务时,它会创建一个外部任务实例,我们的处理程序将对该实例做出反应。我们在 ExternalTaskClient 中使用长轮询来提高通信效率。
接下来,您需要创建一个包,例如 org.camunda.bpm.getstarted.chargecard,并向其添加一个 Java 类,例如 ChargeCardWorker。
package org.camunda.bpm.getstarted.chargecard;
import java.awt.Desktop;
import java.net.URI;
import java.util.logging.Logger;
import org.camunda.bpm.client.ExternalTaskClient;
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) // long polling timeout
.build();
// subscribe to an external task topic as specified in the process
client.subscribe("charge-card")
.lockDuration(1000) // the default lock duration is 20 seconds, but you can override this
.handler((externalTask, externalTaskService) -> {
// Put your business logic here
// Get a process variable
String item = externalTask.getVariable("item");
Integer amount = 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();
}
// Complete the task
externalTaskService.complete(externalTask);
})
.open();
}
}
2.1.5、运行外部任务
您可以通过右键单击该类并选择 来运行 Java 应用程序,ChargeCardWorker Run as Java。
请注意,该外部任务应在测试验证流程过程中一直保持运行状态,因为它要和流程引擎实例进行交互。
工作线程运行后,您可以继续部署进程并启动一些实例。
2.2、使用 JavaScript (NodeJS)开发外部任务
在本节中,您将学习如何在 NodeJS 中实现外部任务工作线程。
2.2.1、先决条件
请确保已安装以下工具:
2.2.2、创建新的 NodeJS 项目
mkdir charge-card-worker
cd ./charge-card-worker
npm init -y
2.2.3、添加 Camunda 外部任务客户端 JS 库
npm install camunda-external-task-client-js
npm install -D open
2.2.4、实现 NodeJS 脚本
接下来,我们将创建一个订阅该主题的新 ExternalTaskClient。charge-card
当流程引擎遇到配置为外部处理的服务任务时,它会创建一个外部任务实例,我们的处理程序将对该实例做出反应。我们在 ExternalTaskClient 中使用长轮询来提高通信效率。
接下来,您需要创建一个新的 JavaScript 文件,例如 ,如下所示:worker.js
const { Client, logger } = require('camunda-external-task-client-js');
const open = require('open');
// configuration for the Client:
// - 'baseUrl': url to the Process Engine
// - 'logger': utility to automatically log important events
// - 'asyncResponseTimeout': long polling timeout (then a new request will be issued)
const config = { baseUrl: 'http://localhost:8080/engine-rest', use: logger, asyncResponseTimeout: 10000 };
// create a Client instance with custom configuration
const client = new Client(config);
// susbscribe to the topic: 'charge-card'
client.subscribe('charge-card', async function({ task, taskService }) {
// Put your business logic here
// Get a process variable
const amount = task.variables.get('amount');
const item = task.variables.get('item');
console.log(`Charging credit card with an amount of ${amount}€ for the item '${item}'...`);
open('https://docs.camunda.org/get-started/quick-start/success');
// Complete the task
await taskService.complete(task);
});
2.2.5、运行 NodeJS 脚本
您可以使用以下命令运行 NodeJS 脚本:
node ./worker.js
请注意,辅助角色应在整个快速入门指南中保持运行状态。
工作线程运行后,您可以进入下一步以部署流程并启动一些实例。
3、部署BPMN流程
在本步骤中,您将部署流程并启动一个新实例,以便您可以看到您的简单流程是否正常工作。
注意:您无法在 Camunda Cloud 中运行为 Camunda Platform 建模的 BPMN 图,反之亦然。
3.1、使用 Camunda Modeler 部署流程
要部署流程,请单击 Camunda Modeler 中左下方“飞机”图标的部署按钮,然后为其指定部署名称“Payment Retrieval”,REST端点地址写http://localhost:8080/engine-rest,然后单击“部署”按钮。从版本 3.0.0 开始,您将需要提供端点配置的 URL 以及部署详细信息。这可以是 REST API 的根端点(例如http://localhost:8080/engine-rest),也可以是部署创建方法的确切端点(例如http://localhost:8080/engine-rest/deployment/create )。
您应该在 Camunda Modeler 中看到一条成功消息。
3.2、使用 Cockpit 验证部署
接下来,使用 Cockpit 查看进程是否已成功部署。转到 http://localhost:8080/camunda/app/cockpit/ 并使用凭据 demo / demo 登录。您的流程 Payment Retrieval 应在仪表板上可见。
4、启动流程实例
在 Camunda 中,有多种方法可以启动新的流程实例。您可以利用 Camunda REST API 通过发送 POST 请求来启动新的流程实例。
a)curl启动流程
curl -H "Content-Type: application/json" -X POST -d '{"variables": {"amount": {"value":555,"type":"integer"}, "item": {"value":"item-xyz"} } }' http://localhost:8080/engine-rest/process-definition/key/payment-retrieval/start
在工作线程中,您现在应该在控制台中看到输出。这意味着您已经成功启动并执行了第一个简单的流程。
b) REST启动流程
如果您不愿意将 curl 用于 REST 请求,则可以改用任何 REST 客户端。
向以下终结点发出 POST 请求:http://localhost:8080/engine-rest/process-definition/key/payment-retrieval/start
JSON 正文应如下所示:
{
"variables": {
"amount": {
"value":555,
"type":"integer"
},
"item": {
"value": "item-xyz"
}
}
}
提示:确保将标头正确设置为Content-Type: application/json
以下是请求在 Postman 中的外观:
此时,立刻回到 Cockpit查看,发现启动了一个流程实例,当前状态在Charge Credit Card节点上,因为此时外部任务客户端ChargeCardWorker还没有轮询到执行该服务。
几秒钟后,外部任务客户端ChargeCardWorker被轮询到并执行完成,在您的工作线程控制台中应该看到一个输出,并获取到了流程启动时的变量amount和item的值。这也表明了外部任务和流程引擎是可以交换数据的,这种外部任务客户端执行流程任务的方式,也是camunda流程引擎特有的能力,activiti和flowable流程引擎目前不具备执行外部client任务的能力。
这意味着您已经成功启动并执行了第一个简单的流程。
如果您在 Camunda Enterprise Edition 上运行,您还可以在 Camunda Cockpit 中查看已完成的流程实例。开源版本Camunda的Cockpit的功能极其有限,需要开发者进行二次开发扩展,云程低代码平台使用Camunda开源流程引擎进行了大量的功能扩展,可在线体验:http://www.yunchengxc.com
以上演示了Camunda其中一种自动化流程的设计和执行,在某些情况下,我们希望让人参与到我们的流程中,在我们国内的流程需求中,大部分都是人工参与的流程任务。
5、源码和文档
在线体验系统:http://www.yunchengxc.com
源代码下载:https://github.com/camunda/camunda-get-started-quickstart/archive/Step-2a.zip
官方文档地址:https://docs.camunda.org/get-started/quick-start/service-task/