camunda快速入门(二):设计并执行第一个BPMN流程

二、设计并执行第一个BPMN流程

在本节中,您将学习如何使用 Camunda Modeler 创建您的第一个 BPMN 2.0 流程,以及如何执行自动化步骤。

首先打开 Camunda Modeler。

1、创建BPMN流程

通过单击 File > New File > BPMN Diagram (Camunda Platform) 创建新的 BPMN 图。

1-流程设计器(1)

1.1、从一个简单的流程开始

首先对一个简单的流程进行建模。

2-执行自动化步骤 (1)

双击 Start Event。将打开一个文本框。将启动事件命名为“Payment Retrieval requested”。

提示

编辑标签时,可以使用添加换行符。Shift + Enter

单击启动事件。从其上下文菜单中,选择活动形状(圆角矩形)。它将自动放置在画布上,您可以将其拖动到您喜欢的位置。将其命名为 Charge Credit Card。通过单击活动形状并使用扳手按钮将活动类型更改为服务任务。

IMG_259

添加名为 Payment Received 的结束事件。

4-执行自动化步骤(1)

1.2、配置服务任务

使用Camunda平台执行服务任务的方法有很多种。在本指南中,我们将使用外部任务模式。在 Camunda Modeler 中打开属性面板,然后单击您刚刚创建的服务任务。将 Implementation 更改为 and use as the Topic。

5-执行自动化步骤 (1)

1.3、配置执行属性

6-执行自动化步骤(1)

由于我们正在对可执行进程进行建模,在画布的右侧,您可以找到属性面板,单击建模画布上的空白区域时,属性面板将显示进程本身的属性。

首先,为进程配置 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。

7-创建外部任务(1)

完成后,单击“完成”。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。

1-运行client

请注意,该外部任务应在测试验证流程过程中一直保持运行状态,因为它要和流程引擎实例进行交互。

工作线程运行后,您可以继续部署进程并启动一些实例

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 )。

部署流程 (3_6) _docs.camunda.org545

您应该在 Camunda Modeler 中看到一条成功消息。

3.2、使用 Cockpit 验证部署

接下来,使用 Cockpit 查看进程是否已成功部署。转到 http://localhost:8080/camunda/app/cockpit/ 并使用凭据 demo / demo 登录。您的流程 Payment Retrieval 应在仪表板上可见。

部署流程 (3_6) _docs.camunda.org1372

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 中的外观:

0-rest请求发起流程

此时,立刻回到 Cockpit查看,发现启动了一个流程实例,当前状态在Charge Credit Card节点上,因为此时外部任务客户端ChargeCardWorker还没有轮询到执行该服务。

1-流程实例启动了

几秒钟后,外部任务客户端ChargeCardWorker被轮询到并执行完成,在您的工作线程控制台中应该看到一个输出,并获取到了流程启动时的变量amount和item的值。这也表明了外部任务和流程引擎是可以交换数据的,这种外部任务客户端执行流程任务的方式,也是camunda流程引擎特有的能力,activiti和flowable流程引擎目前不具备执行外部client任务的能力。

2-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/

接下来,了解如何设计人工任务流程,如何设计表单,流程和表单如何关联配置,如何部署和发起人工任务流程

posted @ 2024-07-08 08:34  大龄码农有梦想  阅读(182)  评论(0编辑  收藏  举报