工作流系统应该包括什么呢?抛开繁杂冗长的理论,先从一个看得见摸得着的东西入手。
图1.1 人工串行流程
这是一个过程,过程包括了几种不同类型的活动,以及活动之间箭头。通过箭头可以得到当前活动的后续活动,也可以得到前驱活动。从这里看出来,一个流程最起码要有:
- 起始活动,结束活动,
- 人工活动,
- 活动之间的路径变迁。
图1.1描述的是人工活动,需要人来与引擎交互(以后用参与者的概念描述,wfmc规范定义的参与者类型有6种,当前系统实现的有4种),但也许执行者不是由人来驱动,而是由进程/线程来调度,执行一段java代码,执行xxxx.cmd (xxxx.sh)或者发一封邮件,或者跑一个存储过程。那我们就知道活动还可以是自动工具,这自动工具还可以细分。
自动工具(class,批处理,脚本,可以被规则引擎调度的规则因子),而且有的自动工具是需要定时触发的:比如有个存储过程,规定是晚上2:00跑一次,这就有定时调度的要求。自动活动和人工活动统称为业务活动。
这样的描述已经能涵盖80%的功能,但仍然有不足,比如我需要在某个阶段同时作3个活动,或者3个活动里面,根据当时的条件值我只要选1个,情形如图1.2和图1.3。
图1.2 并发(无条件)分支流程
图1.3 条件分支流程
这样我们以前的活动分类就不够用了,开动我们的脑筋,扩展我们的活动类型。根据用户的需求,需要有个地方来进行分支(这里分支也许是条件判定,也许是无条件并发),图1.2,1.3这里描述的是路由活动。路由活动不带业务规则。用户的业务规则只能定义在人工活动和自动活动。路由活动是用来告诉工作流引擎,业务到这里需要进行某种特殊处理。从上述中我们就分析到:
路由活动可以包括:
- 无条件并发(and_split),
- 条件并发(xor_split / or_split ,区别以后阐述)
- 循环并发(while_split,起始xor_split也可以模拟循环)
- 。。。其他特殊模式
当然了,有去有来,有始有终。既然有了split,得有个配对的join路由活动,用来约束,界定条件分支的结尾。所以这里的都是匹配and_split and_join ; xor_split xor_join;while_split while_join,这样就非常严谨。当然,严谨有时候会给复杂流程绘图的时候带来过多的线条,不胜其烦,所以在xor_split和xor_join对中,作了简化,通过descion活动就可以描述后续单一条件,省略了xor_join路由。(在以后的描述中就会理解到其实xor_join在这里并没有逻辑需要处理,故可以省略)
其他的工作流实现当然有其他的方式:比如直接在业务活动上作并发分支,然后在另外一个业务活动上汇聚,业务活动承载着业务逻辑的同时还要进行条件分支的判断。我认为这样不严格,流程是一个严肃的业务表达,需要精确的描述,所以我愿意在引擎里面多设计几个活动类型,以便严谨的告诉引擎:“引擎兄,这里有个并发汇聚(and_join),等当前活动的所有前驱活动都完成后,拜托执行一下后续的活动。。。”。;)
既然有了条件路由活动,那就意味中会有个条件来进行判定,条件它是需要和别人进行PK的,以便选择后续不同的分支,这个别人就是相关数据,你的条件就需要和相关数据进行比较。结果出来后,我又可以严肃的告诉引擎:“引擎兄。。。。。。。。”。 ;)
这里其实是2种不同的设计理念,条件判断是做在活动变迁上,还是做在路由活动上。
对于条件判定,我预定了3种实现的方式:
- 前台界面输入值:适合人工活动,比如某处是一个审核点,审核通过了,该笔工单送oss,没有通过,发给营业员重新检查,这个审核点,上面应该有2个不同的按键,向左或向右,或者是有个下拉框,提供后续活动选择。这里实质就是一个从前台获取了一个变量值。
- Class执行后结果返回值:在设定条件的时候指定指向某个class和fun,当然带不带参数悉听尊便,反正系统只需要一个返回值,我是返回一个object,至于你需要什么去作类型转变。
- 脚本执行后返回值:一段潜入java的动态脚本执行后的结果,比如bsh、Groovy。
当然了,路由活动要使用相关数据,业务活动也不可能不食人间烟火,它总有需要和业务系统进行交互的地方,相互传递数据,勾连关系,眉来眼去。这里的数据就是应用数据(其实这里只是应用数据的一种)。这里有几种方法可以采用,比如采取URL地址带参的方式(get方式);和session关联方式;和数据库的某个表关联,为了更好的规范和约定,我们预先就把这关表给设计好,并起了个与众不同的名字:“应用数据表”。
- 大小: 12.4 KB
- 大小: 16.5 KB
- 大小: 21 KB
分享到:
相关推荐
台电P85(R8A1)官方固件
muPython1.1.0。 Mu是面向初学者的Python编辑器,旨在使学习体验更加愉悦。 它使学生能够尽早体验成功,这在您学习新事物时都非常重要。
固件程序 P85(R8A1) 台电P85_R8A1_Rom 台电P85_R8A1 刷机 ROM包
ADT-8940A1四轴步进\伺服运动控制卡-ADT-8940A1 用户手册
Teclast_P85_R8A1-Android4.0.4-V1.00-8562 台电P85_R8A1 刷机 ROM 程序包
软件包名:LBE_Security_Rel_5.4.8358_A1 支持系统:Android 2.2+ 【软件介绍】 LBE安全大师,一直被模仿,从未被超越!Android手机安全专家! 新版推出安全沙箱功能,隔离运行手机不安全软件! 小白用户-->免去...
float a1 float a2 float ek float ek1 float ek2 float uk float uk1 float ad_just //变量初始化,根据实际情况初始化 Kp= Ti= T= Td=; a0=Kp*(1+T/Ti+Td/T) a1=Kp*(1+2*Td/T) a2=Kp*Td/T /...
GDSH_P910A1V2.0.0B01(t40A下载)无网锁) 中兴U110无锁
DL_P910A1SSV1.00.03,U11t40
S813_Jingling_A1_20211128_1007_uMCP_user
中兴U110-GDSH_P910A1V2.0.0B01(t40A无锁).RAR )
1. 旦终端历史记录被丢失,我们就不得不从头开始 2. 任何时候只要我们修改了其中个件,上述编译命令就会重新编译所有的件,当件够多时这样的编译 1. 注释:即C
489163704589409DY_模拟器版_0002_A1.apk
motorola_V730_A1_SDK.ZIP
ATV61 BV_20219_A1(法国)pdf,ATV61 BV_20219_A1(法国)
ATV71 BV_20219_A1(法国)pdf,ATV71 BV_20219_A1(法国)
思岚雷达LD108_SLAMTEC_rplidar_datasheet_A1M8_v2.4_cn
好东西_E752_A1Z_91-22_8056_v1r
esp32 a1s, wiki_ai_thinker_com_esp32_a1s.pdf,
在 h5ai_v0.29.2_025_a1bb755 版本里,添加了拥有更好的播放体验的 dplayer 播放器。