[Camunda BPMN进阶] 电商订单流程设计与调试

news2024/11/15 18:15:04

目录

摘要

基于BPMN的软件设计思想

电商订单流程业务场景

基本订单流程BPMN设计

1.最基本流程设计

2. 添加超时未付款自动取消功能 

3. 添加15分钟付款提醒

4. 添加用户取消订单事件

进阶订单流程BPMN设计

1. 使用并行网关执行任务

2. 将具有相同事件分支的任务合并为子流程 

3. 使用Event Sub Process

4. 将配送完成通知任务改为Message Event

使用Camunda REST Api调试Workflow

1. 获取Service Task

 2. Service Task fetch and lock

 3. Complete Service Task

4. 手动取消订单 Handle BPMN Error

参考


摘要

假如你是希望学习BPMN,或者想通过集成Camunda来做工作流引擎,那么收藏这篇博客应该就足够了。因为我会介绍BPMN最重要的一些元素,还附加了完整BPMN设计源文件和用来调试的Camunda REST Api的Postman脚本。

源文件地址:Camunda-BPMN - Repos (azure.com)

对BPMN完全没有了解的话请参考我之前的博客:Camunda BPMN_郭麻花的博客-CSDN博客 

这次我们通过一个常见的业务场景:订单流程来说明Camunda在实践当中是如何工作的。

基于BPMN的软件设计思想

BPMN(Business Process Modeling Notation,即业务流程建模符号),是一种流程建模的通用和标准语言。在学习BPMN之前需要先意识到

  • BPMN是一种能被程序识别并执行的语言,而不是简单的流程图;
  • BPMN流并不关心具体实现(系统可以采用微服务或是单体,异步或是同步,或者任何实现方式);
  • BPMN可以通过Camunda这类的流程引擎来执行;
  • Camunda流程引擎只会向外界通知当前流程所处的状态,并接收程序的反馈,做出响应。

这种开发方式要求我们将软件服务分为流程调度任务执行两种类型。

流程调度程序需要配合Camunda来实现任务有序正确的执行,比如当流程调度程序接收到Camunda通知,来到“订单支付成功,给用户发送通知” 这一步时,它将从当前workflow获取该订单流程的状态信息,比如订单号,之后可以通过Api调用,或者消息队列等等任何方式去完成用户通知这一任务。

而任务程序的设计将更加单纯,它不需要,也不应该去考虑workflow前后所发生的事情,那是在设计BPMN时应该去调度协调的事情。比如“订单支付成功,给用户发送通知” 任务,它要做的事情就是根据订单号,拿到需要的订单信息和支付成功通知的内容模板,给用户发送信息。

简单来说,流程调度服务:“让你干啥你干啥”;任务服务:“让我干嘛我干嘛”。

电商订单流程业务场景

电商平台都支持在线下单功能。我们就用以下业务要求为背景来设计一个Camunda workflow:

  1. 用户可以在页面选购商品,并点击提交下单。
  2. 系统通过短信,微信等渠道发送下单成功通知。
  3. 用户需要在30分钟内完成付款,超时未付款则订单自动取消,并且发送取消通知。
  4. 若用户下单后15分钟未付款,则发送待付款提醒。
  5. 用户付款成功之后,发送付款成功通知并等待配送。
  6. 在配送完成之前,用户可以随时手动选择取消订单,系统后台需要取消订单并退款。

思考题:假如之后业务要求开始配送之后的订单不能提交退款申请怎么办?

基本订单流程BPMN设计

1.最基本流程设计

最基本的订单流程应该是这样的,当用户提交订单时便触发最左边的Start Event,一个workflow实例就被创建了出来。

1. BPMN中带有齿轮的长方形格子代表能够被自动执行的任务,叫做Service Task。第一个任务是“Create Order”,可以是由流程调度程序通知订单服务去创建一个订单,订单服务可以选择写入数据库并更新缓存等任何事情;甚至可以什么也不做,直接回复给workflow当前任务已完成也是可以的,流程引擎只负责通知和接收程序反馈,并不关心实现。

2. “Pay for order”和“Pickup”这类任务是User Task,它们并没有一个明确的完成时机,当用户在某个时间完成支付之后,需要由程序去告知workflow当前用户任务已完成,此时workflow会自动继续往下执行。

要善于使用workflow当中的变量,它们可以存放当前workflow的重要信息并一直向下传递,在BPMN中为任务使用合适的Input和Output Parameters非常重要!

2. 添加超时未付款自动取消功能 

我们只需要在workflow的“Pay for order”阶段加一个Timer boundary event,并且把触发时间改为30分钟之后就可以了。当30分钟后 workflow仍处于Pay for order阶段时,实线圆圈的Timer表示Interrupting模式,它触发时将结束当前Task并且转向执行下方的“Order Automatically Canceled”任务。

3. 添加15分钟付款提醒

只需要添加一个虚线代表的Non-Interrupting Timer,15分钟之后触发,它触发时不会结束当前的Task,而是通过分裂Process token到下方的“Send Order Unpaid Notification” ,付款提醒会被自动发送,而workflow会继续等待用户操作。

4. 添加用户取消订单事件

在“Pay for order”和“Pickup”上添加一个Error Event,表示在等待付款和配送阶段,workflow将会接收程序发来的“Order Manually Canceled”事件,当该事件发生时,应当立即结束当前任务,执行订单取消相关的任务。

进阶订单流程BPMN设计

前面介绍了一个基本的BPMN流程的设计思路,接下来我们基于业务要求,设计一个更清晰,低耦合的BPMN流程。

 1. 使用并行网关执行任务

我将订单创建后,配送完成前这一阶段的所有事件与任务划分到了同一个子流程当中,后面会介绍。这里将“发送订单创建成功通知”和“等待付款”两个任务用并行网关分开执行,因为从业务上来讲,发送通知失败不应该影响用户付款,所以这两个任务一定不是串行执行的。

这里为“Send Order Created Notification”加了一个超时自动结束的Timer Event。这因为子流程会因为包含存活的Process Token而无法结束。假如发送通知这类的边缘任务失败,程序也应该能正常往下执行。当然,除了使用BPMN的方式保证流程正常执行以外,也可以通过程序的方式来保证每个Service Task不论结果如何都被结束。

关于Process Token的概念可以参考:BPMN Process Token与Gateway——Camunda Workflow 开发实践

2. 将具有相同事件分支的任务合并为子流程 

之所以将上述服务添加到同一个Sub Process当中是因为它们具有相同的流程分支,即订单取消。

根据业务要求,配送完成前的任何阶段用户都可以选择取消订单,或者超时自动取消订单。因此,通过将上述任务合并到同一个子流程当中,并且为该子流程创建统一的Error Event处理程序更为合理。

Tips:Error Event可以携带信息到workflow当中,前提是需要设置它的Code Variable或Message Variable。

3. 使用Event Sub Process

如图所示,我们可以在子流程当中继续添加子流程。在此我将之前添加的两个Timer触发器改成了事件子流程。

事件子流程同样分为Interrupting和Non-Interrupting两种模式,在将Timer划分到事件子流程之后,我们必须依靠workflow当前的状态来判断订单是否已经支付,以确定下一步状态。

因此我们需要在订单支付后,将“已支付”状态保存到当前workflow实例当中,因此我为“Pay for order”任务添加了一个Output Parameter, 我们在结束Task时可以传递任意参数,但只有当这些参数在Output当中声明后,它们才能被添加到workflow当中,并在之后的流程中使用。

在上面这种情况, “Pay for order”任务结束之后,IsPaid参数可以确定是True。这里使用 ${execution.getVariable('IsPaid')} 是为了从代码传递过来的参数中获取。

4. 将配送完成任务改为Message Event

Message Event代表一个通知的到来,或许订单配送完成并不是靠人为操作,而是依赖于IoT设备,因此我们可以将原先的“Pickup” User Task替换为Message Event(见上图信封图案),只有当系统收到配送完成的消息时才会继续往下进行。

使用Camunda REST Api调试Workflow

Camunda常用接口的Postman文件我已经放在开头的代码仓库里了,可以采用Basic方式身份认证。

1. 获取Service Task

 2. Service Task fetch and lock

 3. Complete Service Task

 可以看到此时处于等待订单支付,且发送订单待支付提醒,两个任务同时进行阶段。而上面的“Send Order Created Notification” 在我截图时已经超时结束了。

4. 手动取消订单 Handle BPMN Error

 此时因为收到订单取消事件,子流程当中的一切活动(Activity)都将被结束,workflow转向“Order Manually Canceled”处理程序。

还有一些接口,这里就不再一一列举了,大家可以到Camunda-BPMN - Repos (azure.com)学习下载。

参考

REST API Reference | docs.camunda.org

BPMN 2.0 Implementation Reference | docs.camunda.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PHP+MySQL月子中心管理系统的设计与实现

月子中心管理系统是信息时代的产物,月子基本是每个适龄女子都会经历的一个特殊时期,尤其是在中国对月子的重视程度尤其的重要,只有让产妇和婴儿受到精心的照顾才能够让产妇更好的康复,才能够让婴儿更好的成长,所以越来越多的人关注到了月子期间的养护问题,为了能够让更多的月子…

安卓APP源码和报告——学生信息管理系统

学生信息管理系统APP演示视频《移动开发技术II》实践考核方案 适用网络工程(网络软件开发)2018级 一、考核内容: 环境配置及移动开发生命周期、控件的使用、用户界面设计、数据存储与访问、广播、服务、网络编程、蓝牙应用等知识点。 二、…

canal同步MySQL的binlog数据时踩了个大坑

背景 在同步MySQL数据到ES的场景中,选择了canal组件同步数据。 问题描述 在同步的时候发现canal-adapter中canal-adapter/conf/es7/product.yml 配置文件中sql 语句连表查询的时候会出现无法更新Elasticsearch 中数据的情况,而且日志没有提示异常&…

python使用opencv画圣诞树和画小星星函数

画星星函数: #img 图片 #x y 坐标 #size 大小 def darw_star(img,x,y,color,size40):poly_linenp.array([[x, y-size], [xint(size/4), y-int(size/4)], [xsize, y-int(size/4)],[xint(0.375*size),yint(size/4)],[xsize,ysize],\[x,yint(0.625*size)],[x-size,ysi…

分布式定时调度:xxl-job 万字详解

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。 1.2.常见定时任务方案…

基于web的家电维修系统/家电维修管理系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的系统管理应运而生,各行各业相继进入信息管理时代&a…

生物素标记甾体化合物/多杀菌素探针分子/壳聚糖/聚乙二醇偶连基团为华生物提供

生物素标记的甾体化合物探针将D-生物素酰氯与胺反应,合成了新型生物素探针标记的甾体衍生物,经检测这些衍生物对某些肿瘤细胞株有较好的抗肿瘤活性,且对正常细胞株(HEK293T)没有明显的毒害作用。 生物素标记的多杀菌素探针分子,经检测验证,生物素标记多…

Python多字段排序函数——cmp_to_key()【LeetCode50天刷题计划寒假特别版(Day 1 — 最大数(11.40-12.20)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言使用方法例子一、题目最大数示例提示二、思路三、代码前言 python标准模块functools中的cmp_to_key可以将一个cmp函数变成一个key函数,从而支持自定…

第二证券|支持多子女购房、提高公积金贷款额度、发放限时补贴

近来,多地购房支持方针密集出台。 12月1日,安徽安庆发布住所公积金新政,对多子女家庭首次请求住所公积金借款购买自住住所,最高借款额度添加10万元。 11月30日,江西九江也优化多子女家庭住所公积金事务,进…

[附源码]Python计算机毕业设计Django公益组织登记与查询系统论文

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Springboot集成shiro框架:

1, Shiro:是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。 使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 2,三…

POSIX线程(二)

目录 一、前言 二、Thread Attributes 1、Setting the Detached State Attribute(thread5.c) 2、Thread Attributes Scheduling (1)Scheduling(thread6.c) 三、Canceling a Thread 1、Canceling a …

[附源码]计算机毕业设计医院门诊管理信息系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

一篇打通线程 等待 中断

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【JavaEE初阶】 🐲🐲本篇内容:介绍 线程的 中断,等待的区别 🐯🐯作者简介:一名现大二的…

思科防火墙——实验练习加命令

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.实验练习 1.实验(1)配置ASA接口 2.实…

HTML网页制作代码——简约的旅游图文相册博客HTML模板(12页)HTML+CSS+JavaScript 静态HTML旅行主题网页作业

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

大学生个人网页设计 HTML个人网页制作 web个人网站模板 简单静态HTML个人网页作品

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

[JavaEE]初始操作系统--进程

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. javaEE概述 2. 计算机发展史 3. 冯诺依曼体系 …

Allegro如何移动器件操作指导

Allegro如何移动器件操作指导 Allegro上可以任意移动器件,具体操作如下 选择Edit-move Find选择Symbols Point根据需要选择 Sym Origin是抓取器件的原点 Body center是抓取器件的中心 User Pick可以自定义抓取的原点,在移动整个模块的并且旋转的时候常用的命令 Sym Pin#设…

投稿时要求注册ORCID,这张学术界身份证到底有哪些用处?

您是否经常遇到向国际期刊投稿时需要提供ORCID账号进行登录呢? 又是否在我们看到喜欢的文献时,不免被其作者圈粉,忍不住要去了解这位学者的其他作品和动向时却又很难搜到准确信息? 对中国学者来说,由于投到国际期刊时…