工作流可以实现业务流程的自动化,用户可以自己定义工作流程,通过流程来把常用的任务组织起来,而无需在程序中固化流程。这也符合当今微服务,低代码开发的趋势。

Camunda是目前主流的一个工作流平台,遵循业界的标准(BPMN, DMN...),国内的很多低代码工作流平台也是基于Camunda来做进一步的定制开发的。

Camunda目前有7和8两个版本,其中最新的8版本是采用SAAS的方式来提供服务,也可以基于Kubernets来部署在云上。但是8版本虽然可以免费使用和更改,但是如果用于商业用途是受限制的。7版本分为社区版和企业版,社区版可以用于商业用途,因此我也是基于7版本来进行研究。

Camunda的核心包括了工作流引擎和建模软件,整个流程可以参加下图:

从以上流程可以看到,工作流的开发人员定义好工作流之后,导出为文件,部署到工作流引擎。引擎负责管理整个工作流的执行,发布工作流中的子任务,任务节点查询引擎的任务列表,执行任务并返回结果给引擎。引擎会把工作流进程的状态持久化到数据库。用户可以通过引擎提供的API,查询工作流的相关状况,以及对用户角色进行管理等。

工作流引擎和任务节点支持几种部署模式,常见的一种分布式集群部署的架构如下:

根据业务量的需求,可以部署多个工作流引擎服务器,通过Nginx实现负载均衡。部署多个独立的任务节点,每个节点都会连接到引擎获取待处理的任务,并执行。这种方式可以灵活的进行水平扩展,满足业务扩展的需求。

Camunda提供了一个工作流建模的桌面版软件,这个软件也是基于bpmn.io开源软件基础上做定制的。我们可以根据自己的需要进行自己的额外定制开发,例如添加自定义的属性面板,汉化界面等等。

以下我将以一个简单的例子来介绍如何使用。

下载并安装Camunda工作流引擎

在docs.camunda.org官网上有介绍。具体有几种方式,既可以直接使用已经编译好的程序运行,或者嵌入到自己的JAVA应用或WEB容器中运行。

这里我选用最简单的方式,直接运行docker镜像

docker run -d --name camunda -p 8080:8080 camunda/camunda-bpm-platform:run-latest

运行之后,访问本地8080端口即可进入到Camunda的管理界面。

定义工作流

下载Camunda的Modeler软件,定义一个工作流,如以下:

可以看到这个工作流定义一个开始节点(这个节点可以配置不同的开始条件,例如API调用触发,定时触发,或者事件触发等,这里是由API调用触发),若干个任务节点(任务节点包括不同类型,如常见的Service Task, User Task等。User Task是需要用户干预的,这里只用到了Service Task),还有一个网关,用于根据上一个任务的输出数据进行判断,执行不同的路径。最后还有一个结束节点,表示整个流程结束。

这里面的第一个Service Task Check Alarm,点击设置属性,其中的Implementation里面的Type设置为External,Topic设置为check-alarm。表示这个任务由一个外部的任务节点执行,引擎会把任务发送到一个check-alarm的主题,任务节点通过订阅这个主题获取需要处理的任务。

网关有两个执行路径,一个是判断Check Alarm任务的alarmid是不是等于123,如果是就执行下一个任务Get Alarm,另一个路径则是直接到结束节点。

点击每个路径,在condition里面设置判断表达式,这里设置${alarmid="123"}或者${alarmid!="123"}

第二个Service Task Get Alarm,设置属性Tpe为Connector,Connector ID设置为http-connector,表示这个服务将调用一个http接口。在Connector inputs里面添加三个输入,分别是url, headers, method。其中url填入要调用的http接口地址,注意如果这个地址需要传入参数的话,需要加上${},例如这里我需要传入上一个任务返回的alarmid参数,因此需要这样写http://ip:port/getalarm?alarmid=${alarmid}。method设置为GET,headers的assignment type设置为Map,然后添加一个条目是Accept,值是application/json。

工作流定义完成之后,可以调用REST API来部署,或者直接点击Modeler软件下方的Deploy按钮,部署到工作流引擎。

编写任务执行代码

首先我们实现一个任务程序,处理上面的第一个任务Check Alarm。这是一个external类型的业务,我们可以基于Java,python或者自己喜欢的语言来编写一个任务节点客户端代码。这里以Java为例。

package com.example;import java.util.logging.Logger;
import org.camunda.bpm.engine.variable.Variables;
import org.camunda.bpm.engine.variable.value.ObjectValue;import java.util.Collections;import org.camunda.bpm.client.ExternalTaskClient;public class CheckAlarmWorker {private final static Logger LOGGER = Logger.getLogger(CheckAlarmWorker.class.getName());public static void main(String[] args) {ExternalTaskClient client = ExternalTaskClient.create().baseUrl("http://172.22.225.152:8080/engine-rest").asyncResponseTimeout(10000) // long polling timeout.build();// subscribe to an external task topic as specified in the processclient.subscribe("check-alarm").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 variableString networktype = externalTask.getVariable("type");LOGGER.info("Query alarm for the network type: '" + networktype);ObjectValue alarmIdObject = Variables.objectValue("123").create();externalTaskService.complete(externalTask, Collections.singletonMap("alarmid", alarmIdObject));}).open();}
}

对于第二个任务Get Alarm,我们只需要实现一个HTTP接口供调用即可,这里省略相关的代码。

之后我们运行这些任务程序,等待处理任务。

启动工作流实例

最后一步就是启动一个工作流实例,执行相应的任务。

这里采用调用REST接口的方式,例如访问以下的curl命令,这里key后面带入的是工作流的Processor ID,在body里面传入一个变量type,数值是amf

curl --location --request POST 'http://172.22.225.152:8080/engine-rest/process-definition/key/Process_1a3tj5v/start' \
--header 'Content-Type: application/json' \
--data-raw '{"variables": {"type": {"value": "amf"}}
}'

启动实例之后,我们可以在Camunda管理界面查看实例运行情况,因为这个工作流很简单,实例一下子就运行完了。我们可以查看任务节点打印的日志,可以看到任务都已正常完成。

以上就是对于工作流的一个实际开发的例子,后续我将研究一下基于bpmn.io的代码,实现一个定制化的建模程序。

Camunda工作流平台的使用相关推荐

  1. GitChat · 运维 | 携程运维工作流平台的演进之路

    GitChat 作者:徐豪杰 原文: 携程运维工作流平台的演进之路 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 [不要错过文末活动] 前言 随着互联网技术的迅速发展,运维的事务也日益 ...

  2. 猿创征文|Camunda工作流

    猿创征文|Camunda工作流 1.Introduction 1.1 Implemented Standards 2.BPMN2.0 2.1 Elements 2.2 Events 3.Camnuda ...

  3. 2、camunda工作流介绍

    简介 camunda工作流源自activity5,是德国一家工作流程自动化软件开发商提供的,现在同时提供camunda7(组件方式)与camunda8(基于云原生)两种平台. 目标: 为业务和IT提供 ...

  4. E8.Net 2005工作流平台版本发布

    2007年2月,完成了EPowerFlow.Net2003版本升级到E8.Net2005版本的工作,今后E8.Net工作流平台就可以使用Microsoft Visual Studio 2005(SP1 ...

  5. 如何在Epower工作流平台(企业流程管理平台)上建立OA系统

        写这篇文章之前,要在这里感谢博客网带来的这个机会,上周末发布了关于工作流技术及企业流程管理平台介绍的文章后,QQ已经加入了很多朋友,大家一起探讨这个平台的一些功能特性,其中大家问得最多的是如何 ...

  6. bilibili基于 Flink 的机器学习工作流平台在 b 站的应用

    简介:介绍 b 站的机器学习工作流平台 ultron 在 b 站多个机器学习场景上的应用. 分享嘉宾:张杨,B 站资深开发工程师 导读:整个机器学习的过程,从数据上报.到特征计算.到模型训练.再到线上 ...

  7. 根据企业信息化应用需求来分析工作流平台的选型

    随着企业信息化建设的发展,选择一个能快速满足个性化需求并灵活稳健的系统架构是企业信息化建设成功的基础,这已经成为一个不争的事实.工作流平台软件作为一个中间件产品,在企业信息系统架构中对于业务流程管理. ...

  8. 石油化工行业需要怎样的工作流平台?

    延长壳牌(广东)石油有限公司成立于2014年5月,是陕西延长石油(集团)有限责任公司和壳牌集团共同注资成立的中外合资企业.公司员工达10000人以上,壳牌总部位于荷兰,是一家全球化的能源和化工集团,是 ...

  9. flowable工作流 流程变量_信也科技工作流平台的技术实践

    1 背景 随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下: 目前OA流程引擎无法满足企业特定业务流程需求,且移动端体验差,定制化困难,使用门槛高,影响简单流程 ...

最新文章

  1. php 点击按钮更新mysql_PHP与mysql超链接 有更新按钮 跳转更新,删除后数据表中的数据 怎么做来着?...
  2. 【网页前端设计Front end】CSS入门(看不懂你来打我)
  3. .net 使用 Aspose.Words 进行 Word替换操作
  4. 基于ZooKeeper实现HA高可用性以及自动主备切换
  5. 搭建主从数据库出现的错误 error connecting to master ‘slave@172.17.0.2:3306‘ - retry-time: 30 retries: 1
  6. SCDPM 2012R2之保护SQL SERVER
  7. opencv linux 编译好,linux下编译opencv
  8. HanLP1.5.2 -python使用介绍
  9. 如何优雅地压缩一张图片
  10. ARM汇编之合法立即数的快速判断方法
  11. 鱼眼相机外参的计算和图像的透视变换
  12. xctf攻防世界 REVERSE 高手进阶区 re2-cpp-is-awesome
  13. vc6.0中的dsp,dsw,ncb,opt,clw,plg,aps等文件的简单说明
  14. Windows下的SSL 应用
  15. Frenetic Python实验(一)
  16. Java 中的 getResource 方法
  17. 个人计算机cpu型号,终于知道如何看懂一个电脑CPU型号了!
  18. 利用淘宝指数做产品数据分析
  19. Unity学习笔记——Unity基础一:unity界面、场景、游戏物体、组件等基本概念
  20. 水经注在《宁夏清水湾小流域治理》工程项目中的应用案例

热门文章

  1. idea2019配置gradle详解_在IDEA里gradle配置和使用
  2. html楼层效果,基于 HTML5 WebGL 的智慧楼宇可视化系统
  3. 删除文件提示:正在准备 再循环
  4. java版本双蛇大战
  5. 带id跳转页面,另一个页面拿id
  6. 星选大师卡来袭!一起感受学习的快乐
  7. 五一户外运动装备怎么选、登山必备物品清单推荐
  8. JavaScript 数组交集
  9. 三国志战略版:四大阵营武将总结——蜀国篇
  10. 愿有情人终成眷属,执手前走共度一生