`
jbpm-x
  • 浏览: 47897 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论

工作流活动实例状态转换的两种实现模式

阅读更多

作者:胡长城

今天和同事chelsea 就活动实例状态的实现思路上进行了讨论。我们两个站在了两个不同的角度来看待,这两个不同的角度也正好眼下最为常见到的两种实现思路:

      Chelsea是从状态角度来看待,当然也完全是从state pattern的角度来思考:状态在达到某个状态的时候,会引起或必须引起活动实例执行什么操作。

       而我是从活动实例的角度来考虑,活动实例的状态只是活动实例的一个属性体,是因为什么行为,造成了什么状态的结果。

<o:p> </o:p>

       这两种观点,没有谁对谁错,也没有谁优谁劣,两者是站在不同的角度来分析同一个问题。其实这两种模式在应用中都是很普遍的,也都是能够很好的解决问题的。不过在现有的workflow引擎实现中,基于活动实例的角度是占绝大多数的,比如obeshark等等。所以我受这个的影响也是比较深的。

<o:p> </o:p>

       先说说基于活动活动实例的角度的思路吧:

<o:p> </o:p>

       让我下先来看看状态类:

public final class WMActivityInstanceState extends WMObjectState {<o:p></o:p>

   public static final int OPEN_NOTRUNNING_INT = 0;<o:p></o:p>

   public static final int OPEN_SUSPENDED_INT = 1;<o:p></o:p>

}<o:p></o:p>

或者也可以这么表示:<o:p></o:p>

public enum WMActivityInstanceState{<o:p></o:p>

  NOTRUNNIN(0),<o:p></o:p>

  SUSPENDED(1);<o:p></o:p>

  private int code;<o:p></o:p>

  private WMActivityInstanceState(int code){this.code = code;}
  public int getCode(){return this.code}<o:p></o:p>

}

<o:p> </o:p>

       对于活动实例来说,状态只是其一个属性而已:

public class BasicActivityInstance extends BasicAttributedEntity{<o:p></o:p>

private int _state;<o:p></o:p>

    public void setState(int state) {<o:p></o:p>

        _state = state; }<o:p></o:p>

}<o:p></o:p>

或者也可以是<o:p></o:p>

Public void setState(WMActivityInstanceState state)

<o:p> </o:p>

       所以,从活动实例的角度来看,状态之间的关系是平行的。你可以在执行完一些初始化的操作之后,将活动实例的状态设置为Initialized:当然这个操作你必须显示的去设置活动实例(当然,你可以用一些Event去处理),比如调用活动实例的setState方法。至于为什么调用这个方法,或者此时设置的状态是对是错,活动实例并不关心

<o:p> </o:p>

       下面再来说说基于状态角度的思路吧,这个思路大体可以说就是state pattern的应用。

<o:p> </o:p>

       说道这儿,您可以看看这篇文档:从工作流状态机实践中总结状态模式使用心得 。当然如果您对state pattern不是很了解,那么建议你先看看这篇文档:设计模式之state <o:p></o:p>

<o:p> </o:p>

       State模式的着眼点就是状态,以状态的变迁影响实例的行为和动作。其实这就是两个不同的抽象体:statestateOwner,我们可以看到,活动实例对象就表现为stateOwner<o:p></o:p>

       State模式的依据是状态之间是有有向连接关系的,这有向连接关系其实就是状态的转换规则:A-B-C-D-A

       激发状态的变迁,是由外界的事件(Event影响的:这个事件会告知,当前的活动实例状态要从当前状态往下一个状态变迁。而活动实例并不知道下一个状态是什么,这完全是状态对象负责维护和告知的。

      

       至此,我们可以看出来了,两种方式的不同:

第一种方式(基于活动实例),其外界事件是影响到活动实例,或者说在事件中显示的告知活动实例状态从什么变为什么。

       第二种方式(基于实例状态),其外界事件是影响到活动实例状态对象,至于这个状态的下一个状态是什么,时间并不知道,完全由活动状态之间的关系来维护。


分享到:
评论

相关推荐

    C#完整工作流系统源码(vs2005).rar

    工作流管理系统是一个软件系统,它完成工作流的定义和管理,并按照在计算机中预先定义好的工作流逻辑推进工作流实例的执行。一个完整的工作流管理系统是由工作流执行部件、工作流功能部件和外部应用系统构成的。工作...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...

    java范例开发大全

    13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载(线程等待和通报) 410 实例225 模拟淘宝购物买卖双方交易问题 412 实例226 携子之手 ...

    XML&JSON 目标检测、实例分割标签转换给yolo用脚本

    多格式支持:兼容XML和JSON两种流行的标注文件格式,覆盖广泛的数据集来源。 针对YOLOv8优化:生成完全兼容YOLOv8的训练数据格式,确保无缝集成。 实例分割适用:除了常规的目标检测数据,还能处理实例分割任务的...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例021 重定向输出流实现程序日志 31 实例022 自动类型转换与强制类型转换 33 2.2 运算符 34 实例023 加密可以这样简单(位运算) 34 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟)... 13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例224 资源搜索并下载(线程...

    java范例开发大全(pdf&源码)

    13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载(线程等待和通报) 410 实例225 模拟淘宝购物买卖双方交易问题 412 实例226 携子之手 ...

    文件转换引擎PantoJS.zip

    如果文件的转换是相互独立的,那么实现 _transform 方法即可,否则需要实现 transformAll 方法,它们都返回 Promise 对象,两种转换器使用 isTorrential() 方法来区分。具体请参见 panto-transformer-...

    java范例开发大全源代码

     实例15 抽奖活动 27  3.2 for语句 28  实例16 小九九乘法表 28  实例17 如何列出素数 29  实例18 Java中的递归 31  实例19 男生女生各多少人 32  实例20 求水仙花数 34  实例21 求任意一个...

    ETL工具KETTLE实例手册

    开源ETL工具 Kettle ------------------------------------------ 分享到 新浪微博腾讯微博已用 ...Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。

    Java范例开发大全(全书源程序)

    13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载(线程等待和通报) 410 实例225 模拟淘宝购物买卖双方交易问题 412 实例226 携子...

    java源码包---java 源码 大量 实例

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    JAVA上百实例源码以及开源项目源代码

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

Global site tag (gtag.js) - Google Analytics