接上一篇文章:Camunda快速入门(一):安装部署Camunda流程平台

在本节中,您将学习如何使用 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。

当流程引擎遇到配置为外部处理的服务任务时,它会创建一个外部任务实例,我们的处理程序将对该实例做出反应。我们在 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开源流程引擎进行了大量的功能扩展,可在线体验:云程 | 云程低代码平台

以上演示了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/

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

Camunda快速入门(三):设计一个人工任务流程并配置表单

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐