## CabloyJS内置工作流引擎的基本介绍 ### **1. 由来** 众所周知,NodeJS作为后端开发语言和运行环境,支持高并发、开发效率高,有口皆碑,但是大多用于`数据CRUD管理`、`中间层聚合`和`中间层代理`等工具场景,很少深入到业务领域的核心。有许多用NodeJS开发的`最小可用产品(MVP)`最终会另起炉灶重构,这是原因之一 究其根源,NodeJS作为业务开发平台,还缺少许多核心的基础构件,`NodeJS工作流引擎`便是其一。CabloyJS从4.0版本起,重点开发了NodeJS工作流引擎,并作为内置的基础核心模块(同样是开源、免费),近一步拓展了NodeJS在后端的应用场景,为深入研发各类商业业务逻辑,提供了基础支撑 ### **2. 特点** 1. 更简便的配置:采用`JSON`进行流程定义的配置,告别`XML`配置文件的冗杂 2. 更清晰的架构:基于`分层机制`采用多个核心模块来搭建工作流引擎的架构,让工作流不再神秘,源码也不再叠床架屋 ## 边界事件的概念与实现 ### 1. Activiti的边界事件 在`Activiti`流程引擎中,可以通过`边界事件`向`流程节点`附加特定用途的处理逻辑。比如,向`流程节点`增加一个`定时器边界事件`,如果节点在指定的时间内没有执行完毕,就会自动触发`边界事件` ### 2. CabloyJS的节点行为 由于`边界事件`的本质是向`流程节点`附加特定的`行为`。 因此,CabloyJS采用`节点行为`机制来实现类似`Activiti`中`边界事件`的功能 CabloyJS为`节点行为`设计了统一的开发规范,允许第三方开发自定义的`节点行为`类型。CabloyJS系统本身也将根据业务的实际需求以及优先级,持续增加内置的`节点行为`类型 ## 3. 边界事件与节点行为的区别 1. `配置简洁`: 1. 在Activiti中,`边界事件`由单独的XML节点配置,并与`活动节点`建立连接 2. 在CabloyJS中,直接在`活动节点`的JSON配置中添加`行为`配置,使得流程定义文件更加简洁、紧凑 2. `开发简便`: 1. 在Activiti中,提供了几个内置的`边界事件`,大多数场景都是基于这些内置`边界事件`做开发,却鲜有人尝试开发自定义的`边界事件` 2. 在CabloyJS中,提供了非常清晰的编程接口,不仅内置常用的`节点行为`,而且允许第三方非常便捷的开发自定义的`节点行为`类型 ## 演示 下面的动图演示了: 1. 向`审核节点`增加`超时行为`,系统自动分配了一个颜色,用于区分不同的`行为` 2. 设置`行为`的配置:`持续时间` 3. 从`行为`拉出一根`转移线`,指向`起草节点` 4. 效果:当超过指定的时间还没有审核完毕,就会自动转向`起草节点` ![flowbehavior-zhcn](https://portal.cabloy.com/api/a/file/file/download/e6948d9a0a994c878f8be5eaf172cdc6.gif) 如果要进一步研究如何创建一个完整的`流程定义`,请参见: 1. [演示:CMS审批工作流](https://cabloy.com/zh-cn/articles/flow-demo-cms.html) 2. [演示:CMS审批工作流(可视化编辑)](https://cabloy.com/zh-cn/articles/flowchart-demo.html) ## JSON规范 为了支持`节点行为`,在原有流程定义的基础之上,同时扩展了`活动节点JSON规范`和`转移线JSON规范`,参见: 1. [流程定义JSON规范](https://cabloy.com/zh-cn/articles/flowdef-json.html) 2. [活动节点JSON规范](https://cabloy.com/zh-cn/articles/flow-node-json.html) 3. [转移线JSON规范](https://cabloy.com/zh-cn/articles/flow-edge-sequence-json.html) ### 1. 活动节点JSON规范 在常规的`活动节点JSON规范`中增加了`behaviors`属性。由于一个`节点`可以附加多个`行为`,因此`behaviors`是一个数组 ``` javascript { id: 'activity_1', name: 'Review', type: 'activityUserTask', options: { assignees: { vars: 'flowUser', }, }, behaviors: [ { id: 'behavior_1', name: 'Overtime', type: 'overtime', color: '#FF3B30', options: { cancelActivity: true, timeDuration: 3000, }, }, ], }, ``` * behavior | 名称 | 说明 | |----|----| | id | 行为唯一标识 | | name | 行为名称 | | type | 行为类型 | | color | 行为颜色。由于`行为`也可以引出`转移线`,因此可以通过不同的颜色进行区分 | | options | 行为配置,对应不同的行为类型 | ### 2. 转移线JSON规范 在常规的`转移线JSON规范`中增加了`behavior`属性,用于标识该`转移线`所对应的`行为Id` ``` javascript { id: 'edge_3', source: 'activity_1', target: 'startEvent_1', behavior: 'behavior_1', }, ``` | 名称 | 说明 | |----|----| | behavior | 对应的`行为Id`,如果不设置就是`节点`本身引出的`转移线` | ## **相关链接** * CabloyJS网站: * NodeJS工作流引擎文档: * GitHub源码仓库: