## 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源码仓库: