首页 > 其他分享 >camunda快速入门(二):设计并执行第一个BPMN流程

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

时间:2024-07-08 09:02:09浏览次数:19  
标签:http 入门 BPMN 流程 item 任务 camunda Camunda

二、设计并执行第一个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/

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

标签:http,入门,BPMN,流程,item,任务,camunda,Camunda
From: https://www.cnblogs.com/hibpm/p/18289234

相关文章

  • [QT入门]常用控件
    1.QPushButton(按钮)常用函数:setText(constQString&text):设置按钮上显示的文本。clicked(boolchecked=false)[signal]:按钮被点击时发出的信号。setIcon(constQIcon&icon):设置按钮上的图标。代码示例:QPushButton*button=newQPushButton("ClickMe!",th......
  • 前端react入门day06-ReactRouter
    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)目录什么是前端路由创建路由开发环境快速开始抽象路由模块路由导航什么是路由导航声明式导航编程式导航导航传参嵌套路由配置什么是嵌套路由嵌套路由配置默认二级路由404路由配......
  • html入门
    1.HTML是什么HTML是什么:即HyperTextMarkuplanguage超文本标记语言,作用是定义网页的内容和结构。2.HTML元素HTML是由一系列元素组成。如:<p>Hello</P>元素可以有属性,如:<pid="p1">Hello</p>元素之间可以嵌套,如:<p>Hello<b>Wolrd</b><......
  • C语言大师之路:从零到王者/新手入门(3)选择语句
    序(一些闲话)我希望我的语言不要像专业书那样让人眼花缭乱,所以当我解释语法时,我会尽量避免使用太多专业术语,让说明更容易理解。我会用通俗易懂的语言来解释,而不是像专业书籍那样让人感到困惑。本人计划通过文章分享C语言的核心知识点和学习心得。鉴于仍处于学习阶段,文章中可......
  • C语言大师之路:从零到王者/新手入门(2)变量与运算符
    序(一些闲话)我希望我的语言不要像专业书那样让人眼花缭乱,所以当我解释语法时,我会尽量避免使用太多专业术语,让说明更容易理解。我会用通俗易懂的语言来解释,而不是像专业书籍那样让人感到困惑。本人计划通过文章分享C语言的核心知识点和学习心得。鉴于仍处于学习阶段,文章中可......
  • UWP WinUI 制作一个路径矢量图标按钮样式入门
    本文将告诉大家如何在UWP或WinUI3或UNO里,如何制作一个路径按钮。路径按钮就是使用几何路径轮廓表示内容的按钮,常见于各种图标按钮,或svg系贴图矢量图按钮在网上有非常多矢量图库,其中免费的图库也非常多,比如https://www.iconfont.cn/等等。在咱的应用程序里面,可以使用这......
  • Java入门基础-数组
    Java入门基础-04数组本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记Java入门基础课程视频地址上一章:Java入门基础-03程序流程控制目录Java入门基础-04数组@[TOC](目录)一、认识数组二、数组的定义和访问1.静态初始化数组数组的访问数组......
  • ArcTs布局入门02——弹性布局(Flex)
    如果你对鸿蒙开发感兴趣,加入“Harmony自习室”吧~......
  • 六、数据可视化—flask框架入门(爬虫及数据可视化)
    六、数据可视化—flask框架入门(爬虫及数据可视化)1,数据可视化简介2,flask(1)创建flask项目(2)开启debug模式(3)通过访问路径传递参数(4)加入渲染模板,渲染HTML文件(4-1)普通变量(4-2)列表变量(4-3)字典变量(5)用户表单提交1,数据可视化简介  数据可视化主要旨在借助于图形化手段,清晰......
  • 张高兴的 MicroPython 入门指南:(二)GPIO 的使用
    目录什么是GPIO使用方法使用微动开关点亮板载LED硬件需求电路代码参考什么是GPIOGPIO是GeneralPurposeInputOutput的缩写,即“通用输入输出”。RaspberryPiPico左右两侧各有一列GPIO引脚,Pico通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。简单的......