Camunda 快速入门
   10 分钟阅读    邵晨峰

Camunda 快速入门

本文为Camunda官网快速入门部分的中文版本
原文地址: https://docs.camunda.org/get-started/quick-start/

0.介绍

本教程将指导您使用Camunda BPM平台建模并实现您的第一个工作流程,其中将使用JAVA或NodeJS作为外部客户端,以及使用DMN分离流程与决策,让我们开始吧!

首先使用git克隆示例代码

git clone https://github.com/camunda/camunda-get-started-quickstart.git
# 如果github速度缓慢,也可以选择使用我的gitee镜像
git clone https://gitee.com/zoollcar/camunda-get-started-quickstart.git

在教程开始之前,首先将代码签出到Start标签

git checkout -f Start

在教程过程中可以随时通过Start标签恢复到初试状态,或使用Step-X(X表示步骤)标签,恢复到任意一步骤的状态

git checkout -f Step-X(将X替换为步骤数字1~6)

教程将分为六个步骤

  1. 下载和安装

在计算机上安装Camunda BPM平台和Camunda Modeler。

  1. 编辑流程

了解处理Camunda Modeler的基础知识,了解如何对完全可执行的流程进行建模和配置,以及如何集成自己的业务逻辑。

  1. 部署流程

将流程部署到Camunda并启动您的第一个流程实例。

  1. 人工任务

了解将人工任务集成到流程中的基础知识,以及如何使用Camunda构建表单。

  1. 动态性

了解如何通过向流程添加网关来使流程更具动态性。

  1. 决策自动化

了解如何在流程中集成DMN决策表。

1.下载和安装

首先,您需要安装 Camunda BPM平台和Camunda Modeler。

前期准备

确保你具有 JAVA1.8以上的JRE或JDK,并可以在命令行使用

在命令行中运行以下命令,检查你的java版本

java -version

可以在 Camunda’s support list 里找到Camunda支持的所有JAVA版本

Camunda Platform (Camunda BPM平台)

首先我们需要下载 Camunda Platform

打开下载地址 https://camunda.com/download/

image-20210525075743771

下载ZIP压缩包,并解压到任意位置

image-20210525080143209

windows运行start.batlinux运行`start.sh,脚本会启动服务

在浏览器中打开 http://localhost:8080/ 就可以看到欢迎页面了

image-20210525081135102

Camunda Modeler(用于编辑流程图及其他模型)

打开下载地址 https://camunda.com/download/modeler/

image-20210525080718066

下载对应系统的版本,并解压到任意位置

image-20210525080810331

执行 camunda-modeler.exe (Windows), camunda-modeler.app (Mac), or camunda-modeler.sh (Linux),即可启动Camunda Modeler

image-20210525080941290

2.编辑流程

本章中,我们将会使用Camunda Modeler创建第一个BPMN 2.0流程,并执行一些自动任务

首先,打开Camunda Modeler

新建BPMN流程

点击 File > New File > BPMN Diagram ,创建一个新的流程设计文件

image-20210525082359058

编辑一个简单的流程

image-20210526060459576

  1. 双击 开始 节点编辑标签,输入“付款请求”

标签可以换行,需要使用Shift +回车

  1. 点击右面显示的方框,添加一个新的活动

可以看到一个新的活动显示到画布上,双击将它命名为“刷卡付款”

  1. 点击取信用卡节点右面的扳手可以修改活动类型,这里我们修改为Service Task(服务类型)

image-20210526063519641

  1. 新增一个结束节点,并命名为“收到付款”

image-20210526063435352

配置“刷卡付款”节点

服务类型有很多执行的方法,这次我们使用“external(外部)”任务模式

  1. 点击“取信用卡”节点,在右侧的面板中修改Implementation(实现)为 External ,修改Topic为 charge-card

image-20210526063609416

配置流程参数

  1. 点击画布的空白处,右侧的面板会显示当前流程本身的参数

这里我们修改id为payment-retrieval,id是区分流程的标识

然后修改Name 为“付款流程”

最后确保 Executable 是勾选的,只有Executable被勾选,流程才能执行

image-20210526063821870

  1. 点击 File > Save File As.. 或者直接点击工具栏中的保存按钮,将流程保存到你喜欢的位置,命名为 payment.bpmn

到此第一部分结束,如果想直接获取到现在为止的进度,可以使用如下命令

git checkout -f Step-1

3.用java或NodeJS实现外部任务

在完成上面流程的编辑后,现在实现“刷卡付款”的业务逻辑

Camunda 可以使多种语言实现业务逻辑,本文将演示java和nodejs两种方式,你可以任意选择喜欢的一种

a)使用JAVA

需要JAVA1.8+,maven(有的IDE自带),IDE

使用喜欢的ide创建一个maven项目,添加maven依赖如下

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

编写主类,代码如下

import java.util.logging.Logger;
import java.awt.Desktop;
import java.net.URI;

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) // 长轮询超时时间
        .build();

    // 订阅指定的外部任务
    client.subscribe("charge-card")
        .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();
  }
}

使用ide上的运行编译运行按钮运行

如果正常运行,则可以进入下一章了

到此第二部分结束,如果想直接获取到现在为止的进度,可以使用如下命令

git checkout -f Step-2a

b)使用NodeJS

需要NodeJS >= v10

首先创建一个新的NodeJS项目

mkdir charge-card-worker
cd ./charge-card-worker
npm init -y

添加Camunda外部任务依赖

npm install camunda-external-task-client-js
npm install -D open

新建一个 JavaScript 文件,命名为 worker.js,代码如下

const { Client, logger } = require('camunda-external-task-client-js');
const open = require('open');

// 外部任务客户端的配置:
//  - 'baseUrl': 流程引擎的url
//  - 'logger': 自动记录的日志等级
//  - 'asyncResponseTimeout': 长轮询的超时时间
const config = { baseUrl: 'http://localhost:8080/engine-rest', use: logger, asyncResponseTimeout: 10000 };

// 根据配置创建一个新的外部任务客户端
const client = new Client(config);

// 订阅charge-card
client.subscribe('charge-card', async function({ task, taskService }) {
  // 将您的业务逻辑写在这

  // 获取流程变量
  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');

  // 完成任务
  await taskService.complete(task);
});

运行

node ./worker.js

如果正常运行,则可以进入下一章了

到此第二部分结束,如果想直接获取到现在为止的进度,可以使用如下命令

git checkout -f Step-2b

4.部署流程

下面我们将部署流程到流程引擎,然后发起流程,检查流程是否发起成功

使用 Camunda Modeler 部署流程

点击工具栏中的部署按钮可以将当前流程部署到流程引擎,点击部署按钮,输入Deployment Name 为 “Payment” ,输入下方REST Endpointhttp://localhost:8080/engine-rest ,然后点击右下角Deploy部署

image-20210527063619110

如果收到成功提示,表示部署成功

image-20210526073534010

关于部署的更多内容可以查看 https://blog.camunda.com/post/2019/01/camunda-modeler-3.0.0-0-released/#completely-reworked-deployment-tool

使用Cockpit查看部署结果

在浏览器中打开 http://localhost:8080/camunda/app/cockpit/default/#/processes 使用账号 demo / demo 登录 ,可以看到刚部署的流程显示出来了

image-20210526074054652

创建流程实例(发起流程)

这里使用Rest API发起流程,所以需要一个接口测试工具(例如:Postman),或者也可以使用电脑自带的curl

a) curl

在命令行中执行

curl -H "Content-Type: application/json" -X POST -d '{"variables": {"amount": {"value":555,"type":"long"}, "item": {"value":"item-xyz"} } }' http://localhost:8080/engine-rest/process-definition/key/payment-retrieval/start

如果能看到成功的返回结果,则流程发起成功

b)Postman

在url中输入 http://localhost:8080/engine-rest/process-definition/key/payment-retrieval/start

模式选择POST

点击Body,选择raw,并在右面选择application/json

然后输入Body内容:

{
	"variables": {
		"amount": {
			"value":555,
			"type":"long"
		},
		"item": {
			"value": "item-xyz"
		}
	}
}

编辑完成后,结果这样:

image-20210526075056144

点击 Send 发送请求

如果能看到成功的返回结果,则流程发起成功

5.添加人工任务

在本章中,我们会将人工任务添加进流程中,让人参与到 BPMN 2.0 流程中来。

添加人工任务节点

首先打开 Camunda Modeler ,在左侧选择任务节点(圆角矩形),将它拖入“付款请求”和“刷卡付款”之间,重命名为“批准付款”

image-20210527061005998

点击刚创建的“批准付款”节点,然后点击节点右侧出现的扳手,将节点更改为人工任务(User Task)

image-20210527061148133

配置人工任务

下面我们将为人工任务配置表单:

点击“批准付款节点”,在右侧的属性面板中点击Forms(表单)选项卡,点击下面的加号,添加3个属性:

image-20210527061619655

属性1:

  • ID: amount
  • Type: long
  • Label: 金额

image-20210527062004660

属性2:

  • ID: item
  • Type: string
  • Label: 项目

image-20210527062029129

属性3:

  • ID: approved
  • Type: boolean
  • Label: 是否同意?

image-20210527062104122

部署流程

和上一章一样,使用 Camunda Modeler 工具栏上的上传按钮将流程上传到流程引擎中

测试一下

打开任务列表(http://localhost:8080/camunda/app/tasklist/),使用 demo / demo 登录

点击右上角的 Start process ,在弹出的对话框中选择“付款流程”

image-20210527062701901

这时会弹出编辑流程变量的对话框,可以通过点击 Add a variable 按钮添加变量,这次我们先不添加,直接点击右下角 Start 启动流程

image-20210527063004938

这时,在任务列表应该就能看到刚创建的人工任务了,如果没有可以手动刷新一下

部分用户这里看不到,可能是 All Tasks 过滤器没有自动添加,左侧显示为:

image-20210527070001945

这时点击 Add a simple filter 即可

选择这个任务项,在右侧可以看到表单

image-20210527065738905

点击 Diagram 选项卡,可以看到高亮的节点就是当前进行中的节点

image-20210527065754734

接下来,我们将为流程带来一些变化,仅在金额足够大的时候进行人工审核,下一章:添加网关

到此第三部分结束,如果想直接获取到现在为止的进度,可以使用如下命令

git checkout -f Step-3

6.添加网关

本章中,我们将使用排他网关(Exclusive Gateways),为流程添加分支,仅在金额足够大的时候进行人工审核

添加两个网关

首先打开 Camunda Modeler ,在左侧的工具架中找到网关(菱形),将它拖动到“付款请求”和“刷卡付款”之间,将“批准付款”向下移动再添加一个网关,调整流程,最后看起来类似这样:

image-20210528064839121

现在为新元素命名

image-20210528065311137

配置网关

接下来,我们选择“<1000”的连线,打开属性面板,选择“Condition Type”为“Expression”,这里我们使用JAVA统一表达式语言编写条件,这里要做的是在金额小于1000时直接刷卡付款,则输入表达式 ${amount<1000}

image-20210528070903818

同样的,对另一条线也进行配置,表达式为${amount>=1000}

image-20210528071006747

yes的表达式是${approved}

image-20210528071237329

no的表达式是${!approved}

image-20210528071249885

部署流程

和上一章一样,使用 Camunda Modeler 工具栏上的上传按钮将流程上传到流程引擎中

测试一下

打开任务列表(http://localhost:8080/camunda/app/tasklist/),使用 demo / demo 登录

点击右上角的 Start process ,在弹出的对话框中选择“付款流程”

在上一章中,我们直接点击 Start,但这次我们要增加几个变量来测试动态的流程

image-20210528072028596

试着更改 amount 的值,查看对流程执行顺序的影响

到此第四部分结束,如果想直接获取到现在为止的进度,可以使用如下命令

git checkout -f Step-4

7.决策自动化

在本章中,我们将使用DMN为流程添加一个业务规则

将业务规则添加到流程中

打开 Camunda Modeler,点击 “批准付款”,在右面的扳手菜单中,将类型改为“Business Rule Task ”(业务规则任务)

image-20210528073900585

下一步,将属性面板中的 Implementation 选择为DMN

输入 Decision Refapprove-payment

为了将决策的结果存入流程变量,我们还需要编辑结果变量Result Variableapproved

结果类型 Map Decision Result 选择为 singleEntry ,最后结果如下:

image-20210528074516059

最后保存并部署到流程引擎

使用 amunda Modeler 创建DMN表

点击 File > New File > DMN Diagram 创建一个新的DMN

现在画布上已经存在一个决策元素了,选择它,然后在右侧属性面板中更改Id和Name,这里的Id需要和流程中的Decision Ref属性一致,这次我们输入Id为approve-payment

image-20210528075445291

接下来,点击决策元素左上角的表格按钮,创建新的DMN表

image-20210528075559654

编辑DMN表

首先编辑输入参数,在本例中,为了简单,我们依据项目名进行判断,规则可以使用 FEEL 表达式JUEL 或者 Script 书写,详情可以阅读DMN引擎中的表达式

双击表格中的Input,编辑第一个输入参数

Label : 项目

Expression : item

image-20210528081127492

下面,设置输入参数,双击Output编辑

Label : 是否同意

Name: approved

Type : boolean

image-20210528081536874

下面,我们点击左侧的蓝色加号,添加一些规则,最后类似这样:

image-20210528083218327

部署DMN表

点击顶部的部署按钮,将DMN部署到流程引擎中

image-20210528081952664

测试一下

现在打开 http://localhost:8080/camunda/app/cockpit/ ,使用demo/demo登录,可以看到决策定义增加了一个,点击进去可以看到刚才编辑的DMN

image-20210528082215962

接下来,打开 http://localhost:8080/camunda/app/tasklist/ ,使用demo/demo登录,点击 Start process 按钮,使用以下参数启动:

再点击一次 Start process 按钮,使用如下参数启动:

这里,我们改变了输入的 item,下面我们打开 http://localhost:8080/camunda/app/cockpit/ 点击 Decision Definitions ,可以看到刚才创建的两个流程实例,点击查看“批准付款”的决策情况

image-20210528083538709

到此第五部分结束,如果想直接获取到现在为止的进度,可以使用如下命令

git checkout -f Step-5

恭喜:你已经完成了快速入门部分,接下来可以阅读Spring Boot与进阶内容
或者前往Camunda 文档(英文)

也可以关注我的博客 http://shaochenfeng.com,后续也会继续推出更多Camunda文档翻译或教程