流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

news2025/7/31 7:01:04

作者:李玉亮

JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排、工作流、审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-easyflow),目前在部门的内部业务系统和科技输出系统中广泛应用,其他部门也有使用。

它的特点是简单、灵活、易扩展,开发人员一般30分钟可入门上手,半天可掌握其原理。它分为一个核心模块和若干扩展模块,模块之间松耦合,开发使用时可按需选择、快速集成、渐进式应用,同时支持JSON内置规范和BPMN规范。它的实现原理也有其特色,后面有介绍。

支持的场景功能

节点流转类型

支持顺序流转、条件流转、循环流转等。

节点功能类型

支持脚本节点、用户节点和消息节点。

• **脚本节点:**节点执行时运行一段代码脚本

• **用户节点:**根据用户的操作指令触发节点执行

• **消息节点:**接收消息后触发节点执行

节点串并类型

支持串行执行、并行执行、串并组合执行等。

流程交互场景

支持单次交互一次执行多节点、多次交互一次执行一节点、多次交互一次执行多节点等。

子流程场景

JDEasyFlow支持子流程的场景,可将把复杂的流程节点拆分为子流程,便于业务逻辑抽象。

 

审批流程场景

JDEasyFlow提供了流程任务审批的能力;常用的审批、撤销、驳回、会签、加签等功能都可支持;内置了简单的动态表单。既支持从页面发起和操作流程任务,也支持API的方式,京东OA审批系统也有对接。

功能架构

整体功能架构

JDEasyFlow的功能架构如下图,功能模块之间松耦合, 开发时可按需选择、快速集成、渐进式应用**。**最简单的使用方式为只在业务应用端引入jar包使用流程引擎。如果需要流程可视化功能,可集成BPMN规范模块,如果还需要流程实例持久化、流程定义持久化等更丰富功能,则可以集成其他相关模块。

流程引擎模块

JDEasyFlow的核心模块,此模块提供了基于JSON格式的JDEasyFlow规范进行流程编排的能力,其他模块均基于该模块扩展,相当于流程执行的发动机、CPU。该功能模块为独立组件,无数据库依赖,应用中引入jar包便可使用。

BPMN规范模块

提供了基于BPMN规范进行流程定义和可视化的能力,流程可视化基于[bpmn-js](Web-based tooling for BPMN, DMN, CMMN, and Forms | bpmn.io),其本质为提供了将BPMN格式流程定义转换为JDEasyFlow格式的能力。该模块为独立组件,仅依赖流程引擎模块,无数据库和服务依赖,应用中引入jar包便可使用。

目前可支持常用的BPMN元素:

• **任务:**脚本任务、用户任务、消息任务

• **事件:**开始事件、结束事件、消息接收事件

• **网关:**排他网关、并行网关、包容网关

流程定义和实例管理模块

流程定义模块支持流程定义的中心化、版本化管理,流程实例模块支持流程实例的持久化和生命周期管理。该功能依赖数据库,有服务端和ERP管理端。

任务/审批模块

支持任务生成、任务分配等功能,常用的审批、撤销、驳回、会签、加签等功能都可支持。该功能依赖数据库,有服务端和ERP管理端。

系统架构

整体系统架构

JDEasyFlow的完整系统架构如下,主要有三个端:业务应用端、流程服务端、流程管理端,三个端可部署在单体应用中,也可分开部署。

中间件依赖

· 关系型数据库(如Mysql)

· 缓存(如Redis或R2M)

· 服务通讯框架(如Java API调用或Http调用或JSF调用)

数据库数据模型比较简单清晰,见下图:

性能说明

· 如果仅是服务编排场景,则流程的执行仅依赖内存和CPU,并且是在流程客户端执行,性能上依赖于客户端服务器的性能,普通笔记本实测1秒可执行一个流程请求的1w+个节点,1秒可执行1万+次含1个节点的流程请求

· 如果需要流程状态管理和流程持久化功能,流程引擎在执行时会到流程服务端查询和保存流程实例和流程节点的状态,性能上主要依赖于数据库的查询和插入效率

· 对于流程任务审批功能,流程的任务审批流转是在服务端执行,一方面取决于流程服务端的计算性能,另一方面同样取决于数据库的查询和插入效率

可伸缩性说明

· 流程引擎属于无状态,可随应用实例线性伸缩

· 流程服务端应用实例支持线性扩展

· 流程数据库可通过分库分表的方式支持大数据量的增长

实践建议

在具体实践中,建议部署统一的流程中心(见下图),对流程定义统一管理。各系统的应用只需集成流程客户端jar包进行流程节点开发和流程调用便可。如果系统只使用任务审批的功能,则只需要通过API和消息与流程中心交互便可。

使用示例

流程引擎使用示例

在源码的test目录下有quickstart测试用例(easyflow\easyflow-flow\src\test\java\com\jd\easyflow\flow\quickstart\QuickStartTest.java),可直接运行或调试以了解使用方式和运行原理。具体实践步骤如下:

1、代码中引入easyflow-flow jar包,以maven为例:

<dependency>
        <groupId>com.jd.easyflow</groupId>
        <artifactId>easyflow-flow</artifactId>
        <version>{替换为最新版本}</version>
</dependency>


2、编写流程定义文件,以node001->node002→node003的执行顺序为例:

{"id": "quickstart_001", "name": "Quick Start 001",
"nodes": [
  {"id": "node001","name": "Node001","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()"},"start": true,"post": {"to": "node002"}},
  {"id": "node002","name": "Node002","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()"},"post": {"to": "node003"}},
  {"id": "node003","name": "Node003","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()"}}
]
}


其中QuickStart001Node01Action等为java节点动作类。完整的流程定义配置项可见: Flow engine usage · JDEasyFlow/jd-easyflow Wiki · GitHub (公网)

3、编写应用启动时加载流程引擎的代码

   FlowEngineImpl flowEngine = new FlowEngineImpl();
   flowEngine.setFlowPath("classpath:flow/quickstart/quickstart_001.json");
   flowEngine.init();


Spring环境可直接定义FlowEngineImpl bean.

4、编写具体流程调用执行的代码

    FlowParam param = new FlowParam("quickstart_001");
    FlowResult result = flowEngine.execute(param);


完整测试用例的执行结果打印如下:

[main           ] INFO FlowEngineImpl         - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json
[main           ] INFO FlowEngineImpl         - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null
[main           ] INFO BaseFlowRunner         - EXECUTE NODE:node001
[main           ] INFO QuickStart001Node01Action - Execute Node 001
[main           ] INFO BaseFlowRunner         - NEXT NODES:node002
[main           ] INFO BaseFlowRunner         - EXECUTE NODE:node002
[main           ] INFO QuickStart002Node01Action - Execute Node 002
[main           ] INFO BaseFlowRunner         - NEXT NODES:node003
[main           ] INFO BaseFlowRunner         - EXECUTE NODE:node003
[main           ] INFO QuickStart003Node01Action - Execute Node 003
[main           ] INFO BaseFlowRunner         - NEXT NODES:
[main           ] INFO QuickStartTest         - Execute finish, current node is:node003


BPMN模块使用示例

打开easyflow-flow-bpmn/BPMNDesigner.html流程设计器. 点击导入按钮,导入easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn文件,可在设计器中看到和以上JSON定义等价的BPMN流程定义.

代码集成使用时只需要将FlowEngineImpl的flowParser设置为BpmnFlowParser.

更多

以上只是流程引擎和BPMN模块的简单使用示例,JDEasyFlow还包含其他模块、可支持很多的配置项和使用场景,更多使用可见最后的对接使用介绍.

实现原理

目前市面上的流程编排组件基本都是基于图(边和顶点)结构的,而本组件是参考了计算机指令执行模型而实现,借鉴了程序计数器的实现原理,引擎内部通过类似程序计数器(PC)的待执行节点栈来维护后继节点;可以理解为是一种高级业务编程语言,它同时也是图灵完备的。

流程引擎核心模型名词只有一个:**节点(Node),**节点的功能为执行逻辑并输出后续节点 。

开发态可定义有限的节点,通过每个节点与其后续节点连接形成有向图;运行态按规则逻辑进行节点流转,支持并行执行,支持顺序、条件或循环,支持fork-join。

概念:

• **流程:**一个业务流程的抽象

• **节点:**流程的组成单位,一个节点能够执行节点动作同时可返回后继节点

节点内部构件:

节点内部构件的组成是可自定义的,流程引擎提供了缺省实现,其内部构件包括了前处理器(PreHandler)、节点动作(NodeAction)、后处理器(PostHandler)

• **前处理器:**判断该节点是否可以执行动作

• **节点动作:**真实的业务功能处理

• **后处理器:**负责计算后续节点

流程引擎执行逻辑

流程引擎有一个或多个流程触发节点,流程触发后执行如下逻辑:

1. 初始化流程上下文

2. 得到流程起始节点ID,放入执行栈

3. 如果执行栈为空,则返回,否则执行当前节点

  1. 预检查

  2. 执行Action

  3. 计算后继节点ID并返回

4. 将后继节点放入执行栈,从栈中取出待执行节点,跳到第3步

因此JDEasyFlow整体的特色为简单

• 模型简单:核心模型概念就是节点的流转

• 扩展简单:提供了监听器、过滤器功能,方便横向切面;节点支持自定义实现

• 定义简单:只需要通过JSON进行节点流转逻辑配置便可,也支持BPMN格式

• 运行简单:代码调用流程引擎,传入流程ID和业务参数便可

• 使用简单:引入组件包便可使用,比较轻量

适用场景和对接使用说明

适用场景

理论上JDEasyFlow可满足任何流程场景,它主要可解决三类问题:

• **流程可编排:**将业务流程抽象为软件流程,保证软件是现实的真实反映;不同场景可定义不同流程,且流程易修改

• **功能松耦合:**将业务节点抽象为软件流程节点,一方面实现功能的松耦合,另一方面实现节点的可复用

• **流程可视化:**所见即所得,方便业务产品人员和软件研发人员基于同一语言的交流,也便于流程监控

在实际软件系统开发过程中,如果有如下诉求,可考虑使用流程编排:

• 业务流程是有明显的多个节点组成

• 希望流程可灵活变更

• 业务流程级别比程序流程高一层,在编程语言级别难以聚合和治理(如一个流程即需要前台操作,又有外系统参与,又有后台操作,在实现上入口分散)

对接使用

JDEasyFlow的所有文档可见: https://github.com/JDEasyFlow/jd-easyflow/wiki (公网)

欢迎大家对接使用,有相关使用问题可联系: liyuliang5@jd.com

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

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

相关文章

项目经理年终夜话:我的“第二年状态”

近日&#xff0c;网络热词“第二年状态”又引发了网友们的热议&#xff0c;是指最初的热情消磨后&#xff0c;幻想破灭&#xff0c;在理想与现实巨大落差面前&#xff0c;陷入迷茫与彷徨。 而“如何度过第二年状态&#xff1f;”这一话题也被大家讨论和分享。其中&#xff0c;贾…

分布式文件系统HDFS实践及原理详解part3

HDFS原理 说明&#xff1a;3.5开头目录是因为和上篇文章内容同属一章&#xff0c;所以开头使用了3.5 3.5 HDFS核心设计 3.5.1 心跳机制 1、 Hadoop 是 Master/Slave 结构&#xff0c;Master 中有 NameNode 和 ResourceManager&#xff0c;Slave 中有 Datanode 和 NodeManag…

Milvus 2.2 版本发布!

经过了 4 个月的打磨&#xff0c;Milvus 2.2.0 于 11 月 18 日正式发版&#xff01;2.2 版本推出了包括基于磁盘的近似最近邻&#xff08;ANN&#xff09;索引算法、从文件批量导入数据、基于角色的访问控制等新特性。进一步提升了向量搜索的稳定性、搜索速度和灵活的扩缩容能力…

新建 ASP.NET MVC 三层项目 | 新建 ASP.NET MVC 项目

打开Visual Studio 2019、 点击创建新项目、 在列表中找到:ASP.NET Web应用程序(.NET Framework):用于创建ASP.NET应用程序的项目模板。你可以创建ASP.NET Web Forms、MVC或Web API应用程序,并可以在ASP.NET中添加许多其他功能、 输入项目名称、输入存储位置、输入解决方…

挂耳式蓝牙耳机哪家的好用,列举五款舒适度极佳的耳机分享

谈到骨传导耳机&#xff0c;相信大家都会想到不入耳的佩戴设计&#xff0c;因为这个特性让骨传导耳机迅速席卷整个年轻一代的圈子&#xff0c;相比于传统式的耳机&#xff0c;骨传导耳机在一定程度上是对耳道是具有一定的保护&#xff0c;这也就是为什么骨传导耳机深受群众喜爱…

深入理解Linux网络技术内幕(九)——中断和网络驱动程序

文章目录前言决策和流量方向接收到帧时通知驱动程序轮询中断在中断期间处理多帧定时器驱动的中断事件组合范例中断处理函数下半部函数存在的原因下半部解决方案并发和上锁抢占功能下半部函数微任务软IRQ初始化未决软IRQ的处理__do_softirq函数依体系结构处理软IRQksoftirqd内核…

优维EasyOps,打造新一代运维新方式

数字经济时代&#xff0c;数字技术与企业业务深度融合&#xff0c;越来越多企业开始认识到&#xff0c;IT正在从内部的支撑工具转变为企业发展的核心竞争力。然而&#xff0c;面对信息建设不断深化、系统架构日趋复杂、新兴技术快速迭代等诸多挑战&#xff0c;企业如何在复杂的…

mini-Imagenet处理

由于imagenet-1k 数据集太大&#xff0c;在验证模型方面耗时太久&#xff0c;特意研究了一下mini-Imagenet&#xff0c;用来代替imageNet-1K数据集。 2016年google DeepMind团队从Imagnet数据集中抽取的一小部分&#xff08;大小约3GB&#xff09;制作了Mini-Imagenet数据集&a…

TrustSVD算法进行基于矩阵分解的商品推荐 代码+数据(可作为毕设)

案例简介 (1)方法概述: 本教程包含如下内容: 从原始的数据文件中加载数据,进行训练集和测试集的切分,并对测试集进行负采样。 对数据分batch, 利用用户历史点击记录进行模型训练 结果展示 数据集:https://download.csdn.net/download/qq_38735017/87154848 (2)宏观流程图 …

Flutter高仿微信-第32篇-单聊-语音

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取语音聊天实…

数据治理中最常听到的名词有哪些?

开门见山&#xff0c;我们先来说说何为“数据治理” 数据治理就是实现数据价值的过程。通俗的理解就是让企业的数据从不可控、不可用、不好用到可控、方便易用且对业务有极大帮助的过程。 这个过程怎么实现&#xff1f;通过采集、传输、储存等一系列标准化流程将原本零散的数…

【网络安全】文件上传之安全狗bypass

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

极光推送SDK引起的内存泄露排查

发现问题 发现推送服务的老年代不断增长&#xff0c;部分内存无法回收 内存泄露堆栈分析 通过运维平台ark&#xff0c;执行了jmap进行heaphump&#xff0c;使用mat工具分析&#xff0c;发现可能存在内存泄露 发现有大量的SocksSocketImpl对象被Finalizer引用 看SocksSocke…

SolidWorks二次开发 API-SOLIDWORKS Simulation分析参数修改

今天我们来讲个小例子。 是关于SOLIDWORKS Simulation的。 先说明一点&#xff0c;这东西我也不熟。有问题别问我 首先&#xff0c;我做了一个很难的分析&#xff0c;条件也是很复杂&#xff0c;具体操作我就不说了&#xff0c;分析结果如下: 当然这个图和我们今天要做的事情…

【台前调度】使用指南:如何打开和关闭iPadOS 16台前调度

【台前调度】可以说是iPadOS 16系统最实用的功能之一。它拥有崭新的多任务处理能力&#xff0c;能自动管理App和视窗&#xff0c;使多个任务窗口能够快速又简单地切换。 但是不少小伙伴更新iPadOS 16后还不知道怎么使用台前调度功能。如何开启使用和关闭iPadOS台前调度&#xf…

[附源码]SSM计算机毕业设计旅游管理系统JAVA

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

苹果手机之间怎么传音乐,怎么把音乐传到苹果手机上

很多人喜欢在自己的苹果手机中下载各种音乐&#xff0c;并且会将音乐传输到其他地方&#xff0c;苹果手机之间怎么传音乐&#xff1f;在此处获取将iphone里的音乐传输到电脑和iphone的解决方案。 一、iPhone如何传输音乐到电脑&#xff1f; 方法1&#xff1a;通过iTunes将iPho…

黑马瑞吉外卖之购物车功能开发(添加购物车和购物车数据展示)

黑马瑞吉外卖之购物车功能前端界面分析后台购物车功能逻辑实现前端界面分析 当我们点击选择规格的时候&#xff0c;数据参数item会传入按钮绑定的方法中 我们点击到这个按钮的时候&#xff0c;那么就会绑定到这个方法。这个方法会将数据给这个窗体中的数据项赋值。这个diaglo…

【linux】【platform[1]】简述device和driver几种匹配方式

文章目录0.env10. 简述20. 测试源码1. driver2. device2.1 方式一&#xff1a;DTS2.2 方式二&#xff1a;ACPI2.3 方式三&#xff1a;id table2.4 方式四&#xff1a;NAME3. 测试log0.env ARM 32bit linux4.4.6010. 简述 主要讲述了几种device和driver匹配的方式以及demo框架文…

82055-94-5|N3-PEG-N3|Azide-PEG-Azide|叠氮PEG叠氮可修饰蛋白质

可用来修饰蛋白质、多肽以及其他材料的叠氮-PEG-叠氮&#xff0c;其英文名为N3-PEG-N3或Azide-PEG-Azide&#xff0c;它所属分类为Azide PEG。 该peg试剂的分子量均可定制&#xff0c;有&#xff1a;叠氮-PEG-叠氮 2000、叠氮peg叠氮 1000、叠氮-聚乙二醇-叠氮 5000、N3-PEG-N…