看看 CabloyJS 工作流引擎是如何实现 Activiti 边界事件的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhennann
V2EX    Node.js

看看 CabloyJS 工作流引擎是如何实现 Activiti 边界事件的

  •  
  •   zhennann 2022-02-13 21:25:28 +08:00 7994 次点击
    这是一个创建于 1402 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    如果要进一步研究如何创建一个完整的流程定义,请参见:

    1. 演示:CMS 审批工作流

    2. 演示:CMS 审批工作流(可视化编辑)

    JSON 规范

    为了支持节点行为,在原有流程定义的基础之上,同时扩展了活动节点 JSON 规范转移线 JSON 规范,参见:

    1. 流程定义 JSON 规范

    2. 活动节点 JSON 规范

    3. 转移线 JSON 规范

    1. 活动节点 JSON 规范

    在常规的活动节点 JSON 规范中增加了behaviors属性。由于一个节点可以附加多个行为,因此behaviors是一个数组

    { 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

    { id: 'edge_3', source: 'activity_1', target: 'startEvent_1', behavior: 'behavior_1', }, 
    名称 说明
    behavior 对应的行为 Id,如果不设置就是节点本身引出的转移线

    相关链接

    2 条回复    2022-02-14 08:17:00 +08:00
    cpstar
        1
    cpstar  
       2022-02-13 23:20:54 +08:00
    zhennann
        2
    zhennann  
    OP
       2022-02-14 08:17:00 +08:00
    @cpstar 是的,Activiti 中的边界事件确实是这样,但是边界事件是作为一个独立 XML 节点进行配置的。不过,在 CabloyJS 中,直接把边界行为作为活动节点内部的 JSON 配置来管理,使得流程定义文件更加简洁、紧凑
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1417 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 16:49 PVG 00:49 LAX 08:49 JFK 11:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86