`
timeson
  • 浏览: 144384 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

工作流_概述(A1)

阅读更多
    工作流系统应该包括什么呢?抛开繁杂冗长的理论,先从一个看得见摸得着的东西入手。



                                               图1.1 人工串行流程

      这是一个过程,过程包括了几种不同类型的活动,以及活动之间箭头。通过箭头可以得到当前活动的后续活动,也可以得到前驱活动。从这里看出来,一个流程最起码要有:
  1. 起始活动,结束活动,
  2. 人工活动,
  3. 活动之间的路径变迁。  

    图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这里描述的是路由活动。路由活动不带业务规则。用户的业务规则只能定义在人工活动和自动活动。路由活动是用来告诉工作流引擎,业务到这里需要进行某种特殊处理。从上述中我们就分析到:

路由活动可以包括:
  1. 无条件并发(and_split),
  2. 条件并发(xor_split / or_split ,区别以后阐述)
  3. 循环并发(while_split,起始xor_split也可以模拟循环)
  4. 。。。其他特殊模式



       当然了,有去有来,有始有终。既然有了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种实现的方式:
  1. 前台界面输入值:适合人工活动,比如某处是一个审核点,审核通过了,该笔工单送oss,没有通过,发给营业员重新检查,这个审核点,上面应该有2个不同的按键,向左或向右,或者是有个下拉框,提供后续活动选择。这里实质就是一个从前台获取了一个变量值。
  2. Class执行后结果返回值:在设定条件的时候指定指向某个class和fun,当然带不带参数悉听尊便,反正系统只需要一个返回值,我是返回一个object,至于你需要什么去作类型转变。
  3. 脚本执行后返回值:一段潜入java的动态脚本执行后的结果,比如bsh、Groovy。


    当然了,路由活动要使用相关数据,业务活动也不可能不食人间烟火,它总有需要和业务系统进行交互的地方,相互传递数据,勾连关系,眉来眼去。这里的数据就是应用数据(其实这里只是应用数据的一种)。这里有几种方法可以采用,比如采取URL地址带参的方式(get方式);和session关联方式;和数据库的某个表关联,为了更好的规范和约定,我们预先就把这关表给设计好,并起了个与众不同的名字:“应用数据表”。
  • 大小: 12.4 KB
  • 大小: 16.5 KB
  • 大小: 21 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics