`
yinhj
  • 浏览: 74400 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

开始研究OSWorkFlow了.目标:实现可视化的设计器与流程定义.

阅读更多

 1.    OSWorkFlow基本概念
    在商用和开源世界里,OSWorkflow 都不同于这些已有的工作流系统。最大不同在于 OSWorkflow 有着非常优秀的灵活性。在开始接触 OSWorkflow 时可能较难掌握(有人说不适合工作流新手入门),比如,OSWorkflow 不要求图形化工具来开发工作流,而推荐手工编写 xml 格式的工作流程描述符。它能为应用程序开发者提供集成,也能与现有的代码和数据库进行集成。这一切似乎给正在寻找快速“即插即用”工作流解决方案的人制造了麻烦,但研究发现,那些“即插即用”方案也不能在一个成熟的应用程序中提供足够的灵活性来实现所有需求。
2.    OSWorkFlow主要优势
OSWorkflow 给你绝对的灵活性。OSWorkflow 被认为是一种“低级别”工作流实现。与其他工作流系统能用图标表现“Loops(回路)”和“Conditions(条件)”相比,OSWorkflow 只是手工“编码(Coded)”来实现的。但这并不能说实际的代码是需要完全手工编码的,脚本语言能胜任这种情形。OSWorkflow 不希望一个非技术用户修改工作流程,虽然一些其他工作流系统提供了简单的 GUI 用于工作流编辑,但像这样改变工作流,通常会破坏这些应用。所以,进行工作流调整的最佳人选是开发人员,他们知道该怎么改变。不过,在最新的版本中,OSWorkflow 也提供了 GUI 设计器来协助工作流的编辑。

OSWorkflow 基于有限状态机概念。每个 state 由 step ID 和 status 联合表现(可简单理解为 step 及其 status 表示有限状态机的 state)。一个 state 到另一 state 的 transition 依赖于 action 的发生,在工作流生命期内有至少一个或多个活动的 state。这些简单概念展现了 OSWorkflow 引擎的核心思想,并允许一个简单 XML 文件解释工作流业务流程。
3.    OSWorkFlow核心概念
3.1.    概念定义
 
步骤(Step)
    一个 Step 描述的是工作流所处的位置。可能从一个 Step Transtion(流转)到另外一个 Step,或者也可以在同一个 Step 内流转(因为 Step 可以通 Status 来细分,形成多个State)。一个流程里面可以多个Step。

状态(Status)
    工作流 Status 是用来描述工作流程中具体Step(步骤)状态的字符串。OSWorkflow 的有 Underway(进行中)、Queued(等候处理中)、Finished(完成)三种 Status。一个实际State(状态)真正是由两部分组成:State = (Step + Status) 。

流转(Transtion)
    一个State到另一个State的转移。

动作(Action)
    Action 触发了发生在 Step 内或 Step 间的流转,或者说是基于 State 的流转。一个 step 里面可以有多个Action。Action 和Step 之间的关系是,Step 说明“在哪里”,Action 说明“去哪里”。 一个 Action 典型地由两部分组成:可以执行此Action(动作)的
Condition(条件),以及执行此动作后的 Result(结果)。   

条件(Condition)
类似于逻辑判断,可包含“AND”和“OR”逻辑。比如一个请假流程中的“本部门审批阶段”,该阶段利用“AND”逻辑,判断流程状态是否为等候处理中,以及审批者是否为本部门主管。

结果(Result)
Result 代表执行Action(动作)后的结果,指向新的 Step 及其 Step Status,也可能进入 Split 或者 Join。Result 分为两种, Contidional-Result (有条件结果),只有条件为真时才使用该结果,和 Unconditional-Result(无条件结果),当条件不满足或没有条件时使用该结果。

分离/连接(Split/Join)
流程的切分和融合。很简单的概念,Split 可以提供多个 Result(结果);Join 则判断多个 Current Step 的态提供一个 Result(结果)。
3.2.    步骤、状态和动作(Step, Status, and Action)
工作流要描述步骤(Step)、步骤的状态(Status)、各个步骤之间的关系以及执行各个步骤的条件和权限,每个步骤中可以含有一个或多个动作(Action),动作将会使一个步骤的状态发生改变。

对于一个执行的工作流来讲,步骤的切换是不可避免的。一个工作流在某一时刻会有一个或多个当前步骤,每个当前步骤都有一个状态值,当前步骤的状态值组成了工作流实例的状态值。一旦完成了一个步骤,那么这个步骤将不再是当前步骤(而是切换到一个新的步骤),通常一个新的当前步骤将随之建立起来,以保证工作流继续执行。完成了的步骤的最终状态值是用Old-Status属性指定的,这个状态值的设定将发生在切换到其他步骤之前。Old-Status的值可以是任意的,但在一般情况下,我们设置为Finished。

切换本身是一个动作(Action)的执行结果。每个步骤可以含有多个动作,究竟要载入哪个动作是由最终用户、外部事件或者Tiggerd的自动调用决定的。随着动作的完成,一个特定的步骤切换也将发生。动作可以被限制在用户、用户组或当前状态。每一个动作都必须包含一个Unconditional Result和0个或多个Conditional Results。

所以,总体来说,一个工作流由多个步骤组成。每个步骤有一个当前状态(例如:Queued, Underway or Finished),一个步骤包含多个动作。每个步骤含有多个可以执行的动作。每个动作都有执行的条件,也有要执行的函数。动作包含有可以改变状态和当前工作流步骤的results。
3.3.    结果、分支和连接(Results, Joins, and Splits)
3.3.1.    无条件结果(Unconditional Result)
对于每一个动作来讲,必须存在一个Unconditional Result。一个result是一系列指令,这些指令将告诉OSWorkFlow下一个任务要做什么。这包括使工作流从一个状态切换到另一个状态。
3.3.2.    有条件结果(Conditional Result)
Conditional Result是Unconditional Result的一个扩展。它需要一个或多个Condition子标签。第一个为true的Conditional(使用AND或OR类型),会指明发生切换的步骤,这个切换步骤的发生是由于某个用户执行了某个动作的结果导致的。
3.3.3.    三种不同的Results(conditional or unconditional)
一个新的、单一的步骤和状态的组合。
一个分裂成两个或多个步骤和状态的组合。
将这个和其他的切换组合成一个新的单一的步骤和状态的组合。
每种不同的result对应了不同的xml描述,你可以阅读http://www.opensymphony.com/osworkflow/workflow_2_7.dtd,获取更多的信息。
注意:通常,一个split或一个join不会再导致一个split 或 join的发生。
3.4.    自动步骤(Auto actions)
有的时候,我们需要一些动作可以基于一些条件自动地执行。为了达到这个目的,你可以在action中加入auto="true"属性。流程将考察这个动作的条件和限制,如果条件符合,那么将执行这个动作。 Auto action是由当前的调用者执行的,所以将对该动作的调用者执行权限检查。
3.5.    整合抽象实例(Integrating with Abstract Entities)
建议在你的核心实体中,例如"Document" 或 "Order",在内部创建一个新的属性:workflowId。这样,当新的"Document" 或 "Order"被创建的时候,它能够和一个workflow实例关联起来。那么,你的代码可以通过OSWorkflow API查找到这个workflow实例并且得到这个workflow的信息和动作。
3.6.    工作流实例状态(Workflow Instance State)
有的时候,为整个workflow实例指定一个状态是很有帮助的,它独立于流程的执行步骤。OSWorkflow提供一些workflow实例中可以包含的"meta-states"。这些"meta-states"可以是CREATED, ACTIVATED, SUSPENDED, KILLED 和 COMPLETED。当一个工作流实例被创建的时候,它将处于CREATED状态。然后,只要一个动作被执行,它就会自动的变成ACTIVATED状态。如果调用者没有明确地改变实例的状态,工作流将一直保持这个状态直到工作流结束。当工作流不可能再执行任何其他的动作的时候,工作流将自动的变成COMPLETED状态。

然而,当工作流处于ACTIVATED状态的时候,调用者可以终止或挂起这个工作流(设置工作流的状态为KILLED 或 SUSPENDED)。一个终止了的工作流将不能再执行任何动作,而且将永远保持着终止状态。一个被挂起了的工作流会被冻结,他也不能执行任何的动作,除非它的状态再变成ACTIVATED。
4.    OSWorkFlow包用途分析及代码片断
4.1.    com.opensymphony.workflow
该包为整个OSWorkflow 引擎提供核心接口。例如 com.opensymphony.workflow.Workflow 接口,可以说,实际开发中的大部分工作都是围绕该接口展开的,该接口有 BasicWorkflow、EJBWorkflow、OfbizWorkflow 三个实现类。
4.2.    com.opensymphony.workflow.basic
该包有两个类,BasicWorkflow 与 BasicWorkflowContext。BasicWorkflow 不支持事务,尽管依赖持久实现,事务也不能包裹它。BasicWorkflowContext 在实际开发中很少使用。

public void setWorkflow(int userId) {
    Workflow workflow = new BasicWorkflow(Integer.toString(userId));
}

4.3.    com.opensymphony.workflow.config
该包有一个接口和两个该接口的实现类。在 OSWorkflow 2.7 以前,状态由多个地方的静态字段维护,这种方式很方便,但是有很多缺陷和约束。最主要的缺点是无法通过不同配置运行多个 OSWorkflow 实例。实现类 DefaultConfiguration 用于一般的配置文件载入。而 SpringConfiguration 则是让 Spring 容器管理配置信息。

public void setWorkflow(int userId) {
    Workflow workflow = new BasicWorkflow(Integer.toString(userId));
}
4.4.    com.opensymphony.workflow.ejb
    该包有两个接口 WorkflowHome 和 WorkflowRemote。该包的若干类中,最重要的是 EJBWorkflow,该类和 BasicWorkflow 的作用一样,是 OSWorkflow 的核心,并利用 EJB 容器管理事务,也作为工作流 session bean 的包装器。
4.5.    com.opensymphony.workflow.loader
该包有若干类,用得最多的是 XxxxDescriptor,如果在工作流引擎运行时需要了解指定的动作、步骤的状态、名字,等信息时,这些描述符会起到很大作用。

public String findNameByStepId(int stepId,String wfName) {
    WorkflowDescriptor wd = workflow.getWorkflowDescriptor(wfName);
    StepDescriptor stepDes = wd.getStep(stepId);
    return stepDes.getName();
}
4.6.    com.opensymphony.workflow.ofbiz
    OfbizWorkflow 和 BasicWorkflow 在很多方面非常相似,除了需要调用 ofbiz 的 TransactionUtil 来包装事务。
4.7.    com.opensymphony.workflow.query
该包主要为查询而设计,但不是所有的工作流存储都支持查询。通常,Hibernate 和 JDBC 都支持,而内存工作流存储不支持。值得注意的是 Hibernate 存储不支持混合型查询(例如,一个查询同时包含了 history step 上下文和 current step 上下文)。执行一个查询,需要创建 WorkflowExpressionQuery 实例,接着调用 Workflow 对象的 query 方法来得到最终查询结果。

public List queryDepAdmin(int userId,int type) {
    int[] arr = getSubPerson(userId,type);
   
    //构造表达式
    Expression[] expressions = new Expression[1 + arr.length];
    Expression expStatus = new FieldExpression(FieldExpression.STATUS,
    FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Queued");
    expressions[0] = expStatus;
   
    for (int i = 0; i < arr.length; i++) {
        Expression expOwner = new FieldExpression(FieldExpression.OWNER,
        FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS,
        Integer.toString(arr[i]));
        expressions[i + 1] = expOwner;
    }

    //查询未完成流编号
    List wfIdList = null;
    try {
        WorkflowExpressionQuery query = new WorkflowExpressionQuery(
        new NestedExpression(expressions, NestedExpression.AND));
        wfIdList = workflow.query(query);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4.8.    com.opensymphony.workflow.soap
    OSWorkflow 通过 SOAP 来支持远端调用。这种调用借助 WebMethods 实现。
4.9.    com.opensymphony.workflow.spi
该包可以说是 OSWorkflow 与持久层打交道的途径,如当前工作流的实体,其中包括:EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler。

HibernateWorkflowEntry hwfe = (HibernateWorkflowEntry) getHibernateTemplate()
    .find("from HibernateWorkflowEntry where Id="
        + wfIdList.get(i)).get(0);
4.10.    com.opensymphony.workflow.util
该包是 OSWorkflow 的工具包,包括了对 BeanShell、BSF、EJB Local、EJB Remote、JNDI 的支持。
5.    OSWorkFlow表结构分析
5.1.    OS_WFENTRY
工作流主表,存放工作流名称和状态

字段名    数据类型    说明
ID    NUMBER    自动编号
NAME    VARCHAR2(20)    工作流名称
STATE    NUMBER    工作流状态

5.2.    OS_CURRENTSTEP
当前步骤表,存放当前正在进行步骤的数据

字段名    数据类型    说明
ID    NUMBER    自动编号
ENTRY_ID    NUMBER    工作流编号
STEP_ID    NUMBER    步骤编号
ACTION_ID    NUMBER    动作编号
OWNER    VARCHAR2(20)    步骤的所有者
START_DATE    DATE    开始时间
FINISH_DATE    DATE    结束时间
DUE_DATE    DATE    授权时间
STATUS    VARCHAR2(20)    状态
CALLER    VARCHAR2(20)    操作人员的帐号名称

5.3.    OS_CURRENTSTEP_PREV
前步骤表,存放当前步骤和上一个步骤的关联数据

字段名    数据类型    说明
ID    NUMBER    当前步骤编号
PREVIOUS    NUMBER    前步骤编号

5.4.    OS_HISTORYSTEP
历史步骤表,存放当前正在进行步骤的数据

字段名    数据类型    说明
ID    NUMBER    自动编号
ENTRY_ID    NUMBER    工作流编号
STEP_ID    NUMBER    步骤编号
ACTION_ID    NUMBER    动作编号
OWNER    VARCHAR2(20)    步骤的所有者
START_DATE    DATE    开始时间
FINISH_DATE    DATE    结束时间
DUE_DATE    DATE    授权时间
STATUS    VARCHAR2(20)    状态
CALLER    VARCHAR2(20)    操作人员的帐号名称

5.5.    OS_HISTORYSTEP_PREV
前历史步骤表,存放历史步骤和上一个步骤的关联数据

字段名    数据类型    说明
ID    NUMBER    当前历史步骤编号
PREVIOUS    NUMBER    前历史步骤编号

5.6.    OS_PROPERTYENTRY
属性表,存放临时变量

字段名    数据类型    说明
GLOBAL_KEY    VARCHAR2(255)    全局关键字
ITEM_KEY    VARCHAR2(255)    条目关键字
ITEM_TYPE    NUMBER    条目类型
STRING_VALUE    VARCHAR2(255)    字符值
DATE_VALUE    DATE    日期值
DATA_VALUE    BLOB    数据值
FLOAT_VALUE    FLOAT    浮点值
NUMBER_VALUE    NUMBER    数字值

分享到:
评论
2 楼 quickSand 2007-06-26  
总结得很全面很细致阿.
1 楼 yinhj 2007-01-18  
示例终于可以跑在ORACLE 10G上了.

相关推荐

    osworkflow-2.8.0.zip

    设计器是osWorkflow的一个可视化工具,允许用户通过图形界面设计和编辑工作流。它支持创建、修改和导出工作流定义,帮助非程序员也能理解并参与到工作流的设计中来。 2. **核心库:osworkflow-2.8.0.jar** 这是...

    osworkflow2.8.pdf

    - **挑战**:由于缺乏直观的可视化工具,初学者可能需要一定时间才能掌握如何有效地编写流程定义文件。这意味着开发者需要具备一定的编程基础,能够理解并使用 XML 或者脚本来定义流程逻辑。 - **应用场景**:适用于...

    OSWorkflow工作流程源码(JAVA/JSP)

    - **工作流定义与编辑**: OSWorkflow提供了XML格式的工作流定义,可以通过设计器(如designer.jar)进行可视化编辑,方便地创建和修改工作流程。 - **持久化支持**: OSWorkflow内置了对多种数据库的支持,如MySQL、...

    osworkflow_bundle2

    10. **工作流设计工具**:虽然 OSWorkflow 本身不提供图形化设计工具,但有一些第三方工具(如 JBoss jBPM)可以用于可视化设计 OSWorkflow 流程,并生成相应的 XML 配置。 在 "osworkflow_bundle" 中,你可能会...

    OSWorkflow中文手册.pdf

    - 缺乏良好的可视化工具,用户需要手动编写XML流程描述文件。 #### 1.2 必要文件 - 未具体列出必要文件列表,但在实践中通常包括但不限于工作流引擎本身、配置文件、数据库连接信息等。 #### 1.3 运行示例 - ...

    osworkflow中文手册

    OSWorkflow没有提供直观的可视化工具来定义流程,而是要求开发者使用XML文件来手工书写和定义流程描述。这种方式虽然对技术要求较高,但提供了强大的自定义能力,使得开发者可以设计出满足特定需求的工作流程。 ...

    osworkflow2.8基于Spring+Hibernate

    在调试和测试osWorkflow时,可以使用提供的工作流工作台(WorkflowConsole)来进行可视化操作。通过工作台,我们可以查看工作流状态、分配任务、模拟用户操作等,这极大地简化了开发和调试过程。 最后,为了确保...

    基于web的工作流管理系统的设计与实现

    2. **可视化流程设计器**:提供图形界面,便于非技术人员设计和修改工作流模型。 3. **自定义表单**:允许用户创建和编辑与特定流程相关的数据表单。 4. **权限控制系统**:确保每个用户只能访问和操作他们被授权的...

    Oswofkflow 入门第一例

    Oswfkflow社区提供了多种工具,如工作流设计器,帮助可视化设计流程,以及监控工具,用于实时查看和管理流程实例。这些工具能极大地提升开发效率和用户体验。 总的来说,Oswfkflow是一个强大且灵活的工作流解决方案...

    群友分享的FLEX工作流设计器(含源码)

    工作流设计器是工作流管理系统的核心组件,用于可视化地创建、编辑和管理工作流程。群友分享的这款FLEX工作流设计器,以其出色的界面设计和易用性,为用户提供了直观的流程建模体验。通过源码,我们可以深入研究其...

    六大全开源的工作流引擎对比.docx

    - **易于使用**:提供了简单直观的可视化设计器,支持快速搭建流程。 - **二次开发**:提供了丰富的接口支持,如二次开发接口、微信接口等。 - **优势**:对于希望使用本土化工作流引擎的企业来说,JFlow是一个...

    flex流程编码器(开源)

    而这个Flex流程编码器采用了OSWorkflow作为其核心工作流引擎,将强大的工作流功能与Flex的可视化界面结合在一起,提供了一个直观易用的开源解决方案。 关于“flex 流程 编辑器”的标签,表明该工具的主要功能包括...

    主流工作流对比

    - 实现了流程的可视化。 - 集成了Spring框架,增强了集成能力。 - 强大的可扩展能力。 #### 四、OSWorkflow - **数据库**: 插件式的持久化方式,可以选择内置或自行开发。 - **持久层**: 插件式的持久化方式。 ...

    工作流各项对比.pdf

    Jbpm4采用嵌入式设计,可以在任何JavaEE应用服务器上运行,并且提供了一个基于Eclipse的图形化插件和Web流程设计器。然而,Jbpm4的持久化层并不遵循JPA规范,可能需要用户进行二次开发。此外,其事务管理依赖于...

    开源工作流的比较和描述

    Zebra 的特点在于其对工作流模式的支持以及图形化设计器,使得复杂的业务逻辑变得容易理解。 ### 19. ActiveBPEL ActiveBPEL 是一款专注于执行BPEL4WS (Business Process Execution Language for Web Services) 的...

    工作流引擎核心调度算法.docx

    4. jBpm则以其强大的表达能力和灵活性著称,它可能采用了基于规则的引擎来支持复杂的流程逻辑,同时提供可视化的工作流设计器,使得流程配置更为直观。 接下来,我们转向两个基于Petri网的工作流引擎:YAWL和Bossa...

    jira工作流介绍

    总的来说,Jira工作流的设计思想是将问题处理流程标准化和可视化,降低沟通成本,提高问题解决效率。熟练掌握Jira工作流的配置和应用,对于任何需要项目管理和任务协作的团队来说都是一个非常有价值的能力。通过利用...

Global site tag (gtag.js) - Google Analytics