`
daniel_tu
  • 浏览: 185338 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

OSWorkflow使用问答

阅读更多
1.         从哪儿可以得到OSWorkflow的有关工作流定义的资料?

答:下载之后,在OSWorkflow的docs目录下会有一些dtd文件。其中workflow_2_7.dtd就是2.7的工作流xml使用的dtd。在这个文件中,作者使用注释详细说明了每个元素的含义和作用。

2.         简单的描述一下OSWorkflow工作流定义的特点?
答: OSWorkflow把工作流视为一组关联的Step,通过执行与Step相关的Action,实现从一个Step到另一个Step的转换。从而引起工作 流状态的转换,推动工作的前进。目前OSWorkflow并不支持子流程,这一点可以从它的dtd文件看出来。另一个主要的特点就是脚本(如 beanshell)的支持,OSWorkflow的主要组件,如function、validator等,都支持使用脚本来编程。
3.         如何定义顺序结构?
答:Step1到Step2的转换,可以这样来看:在Step1上执行了一个Action,这个Action的结果是转向到Step2。因此,可以描述成:

<steps>

      <step name="Step1" id="1">

                <actions>

                         <action name="Step1_Action" id="11">

                                  <results>

                                            <unconditional-result old-status="Finished" status="Waiting" step="2"/>

                                  </results>

                         </action>

                </actions>

      </step>

      <step name="Step2" id="2">

        ......

      </step>

<steps>
注意,在OSWorkflow中基本上都是使用id,而不是name。对于status和old-status,前者表示转向到Step2后的状态值(Step2的状态),后者表示离开Step1后状态值(Step1的状态)。
另外,当转向的Step是类似于<step name="end" id="2"/>时,则流程会自动终止。当转向的Step中包含的Action集合中存在一个auto属性为true的action时,转向之后Action自动触发。如:

<step name="Step2" id="2">

    <actions>

        <action name="Step2_Action" id="21" auto="true">

            <results>

                <unconditional-result old-status="Finished" status="Ready1" split="100"/>

            </results>

        </action>

    </actions>

</step>

进入Step2后,Step2_Action将自动执行。

4.         如何定义并行工作中的Split和Join?
答:在状态机中表示并行工作的存在着2个特别的元素:分拆和合并。在 OSWorkflow中与之对应的则是:<split>和< join>。从Step2分拆成2个并行任务(Step31,Step32),再合并并转向Step4。可以如此理解:在Step2上执行一个 Action,其结果会导致Step31和Step32的产生;分别执行Step31和Step32的Action,转向合并点;合并点判断Step31 和Step32都完成后,那么转向Step4。因此,可以描述为:

<steps>

......

<step name="Step2" id="2">

    <actions>

        <action name="Step2_Action" id="21">

            <results>

                <unconditional-result old-status="Finished" status="Ready1" split="100"/>

            </results>

        </action>

    </actions>

</step>

<step name="Split_Step" id="31">

    <actions>

        <action name="Split_Step_Action" id="311">

            <results>

                <unconditional-result old-status="finished" status="Ready2" join="200"/>

            </results>

        </action>

    </actions>

</step>

<step name="Split_Step" id="32">

    <actions>

        <action name="Split_Step_Action" id="321">

            <results>

                <unconditional-result old-status="finished" status="Ready3" join="200"/>

            </results>

        </action>

    </actions>

</step>

<step name="Join_Step" id="4">

    ......

</step>

</steps>

<splits>

<split id="100">

    <unconditional-result old-status="finished" status="Ready5" step="31" />

    <unconditional-result old-status="finished" status="Ready6" step="32" />

</split>

</splits>

<joins>

<join id="200">

    <conditions>

        <condition type="beanshell">

            <arg name="script">

                "finished".equals( jn.getStep(31).getStatus())

              &amp;&amp;"finished".equals( jn.getStep(32).getStatus());

            </arg>

        </condition>

    </conditions>

    <unconditional-result old-status="finished" status="Ready7" step="4" />

</join>

</joins>

注意:<steps>、<splits> 和<joins>可以理解为<step>、< split>和<join>对应的集合。关键是<result>(或<unconditional- result>),使得这些离散的建立了关联,确定了状态转换的目标。

5.         如何建立分支和循环结构?
答:对于循环结构可以由分支结构来模拟,让我们主要来看看分支结构的实现。通常有2种方法:
-          使用外部程序,因为状态改变是Action的结果,而每个Step可以有多个Action。通过在外部程序中决定使用哪个Action,可以达到分支的效果。这个方法的本质实际是将分支判断放到外部程序中。如:

<steps>

      <step name="Step1" id="1">

                <actions>

                         <action name="Step1_Action1" id="11">

                                  <results>

                                            <unconditional-result old-status="Finished" status="Waiting" step="2"/>

                                  </results>

                         </action>

            <action name="Step1_Action2" id="12">

                                  <results>

                                            <unconditional-result old-status="Finished" status="Waiting" step="3"/>

                                  </results>

                         </action>

                </actions>

      </step>

      <step name="Step2" id="2">

        ......

      </step>

    <step name="Step3" id="3">

        ......

      </step>

<steps>
       当处于Step1时,在外部程序如果调用action11,那么下一步就是Step2;如果是action12,下一步就是Step3。
-          使用带条件的结果,相对于上个方法而言,这个是使用OSWorkflow的内部机制。当然,内部条件使用的数据仍然还是由外部调用决定的。如:

<step name="Step2" id="2">

    <actions>

        <action name="Step2_Action" id="21">

            <results>

               <result old-status="Finished" status="Ready1" step="5">

                    <conditions>

                        <condition type="beanshell">

                            <arg name="script">

                                null== transientVars.get("flag");

                            </arg>

                        </condition>

                    </conditions>

                </result>

                <unconditional-result old-status="Finished" status="Ready1" split="100"/>

            </results>

        </action>                     

    </actions>

</step>
       上述描述相当于:
       if(){
              转向step5;
       }else{
              转向split100;
}

从OSWorkflow 的DTD中,可以知道<results>的有关资料:<!ELEMENT results (result*, unconditional-result)>。当有多个带条件的result时,满足条件的第一个<result>起作用,当没有条 件满足时< unconditional-result >起作用。

6.         如何实现自定义的功能?
答:OSWorkflow在工作流描述文件中提供了自定义功能的地方:
-          ,主要在状态改变时发生作用,如状态改变时发送电子邮件通知。对应的元素<function>,用于<pre- functions>和<post-functions>中。针对<step>和<action>都可以使 用,pre-function是进入<step>或<action>时起作用;post-functions是离开时起作用。例 子:function
-          ,自定义条件,如执行action的所需要的条件,在<conditions>中定义。针对<join>、< restrict-to >和<result>起作用。如果在<conditions>包含<conditions>,表示内嵌条件。 condition
-          ,自定义验证,如验证参数或流程的状态,在<validators>中定义。针对<action>、<result>和<unconditional-result>起作用。validator
-          ,为工作流的组件,如function,提供了存取另一个实体的方便操作。可以理解为这个实体的创建工厂,在<registers>中定义。针对工作流的其他组件都起作用。register
上述组件都支持三种类型的定义:Java-based、beanshell和bsf,使用方法基本一致。以function为例:

<function type="beanshell">

<arg name="script">

    System.out.println("prefunction 2 of action 11");

</arg>

</function>

<function type="class">

    <!-- 实现类,参见javadoc -->

    <arg name="class.name">

workflow.Prefunction1OfStep1

</arg>

    <arg name="msg">foxgem is ok!</arg>

</function>

同时OSWorkflow还提供了对应的一些预置组件,请参见相关的javadoc。为了方便数据的交互,OSWorkflow提供了一些内置的对象(对于脚本,直接在脚本中按下面的名字使用即可):
-          ,临时变量Map,包括:register、用户输入和当前的工作流上下文等信息。transientVars
-          ,在文件的<arg>中定义的参数Map。args
-          ,用于持久化的变量。propertySet
-          ,com.opensymphony.workflow.JoinNodes,表示合并的步骤集合。jn

上述对象,前三个可以使用在前面列出的所有组件中使用。最后一个主要在join中定义的conditions中使用,见前例。

7.         外部程序如何使用OSWorkflow?
答:外部程序使用OSWorkflow的基本步骤:
1)        定义工作流文件,并配置。OSWorkflow的配置文件基本上是三个层次:
osworkflow.xml,配置osworkflow的全局信息。如创建工厂,持久化机制等。
    workflows.xml,指明工作流文件的集合
         具体workflow定义,定义具体的工作流描述。
2)        创建工作流:Workflow flow= new BasicWorkflow("tester");。
3)        初始化指定的工作流。
//最后一个参数,可以传进一些数据供OSWorkflow的组件使用
long id= flow.initialize( "mytest", 1, null);
其中 mytest,是在workflows.xml中定义的名字,对应具体的工作流定义文件。在OSWorkflow中有一组特定的Action,< initial-actions>,它的目的就是用来初始化流程的。典型的<initial-actions>定义如下:

<initial-actions>

      <action name="Start Workflow" id="1">

                <results>

                         <unconditional-result old-status="Finished" status="Queued" step="1"/>

                 </results>

      </action>

      <action name="Another Entry" id="2">

                <results>

                         <unconditional-result old-status="Finished" status="Underway" step="2"/>

                </results>

      </action>

</initial-actions>

这其中的每个Action代表了不同的流程启动点。

4)        执行指定的动作,完成流程状态的切换。flow.doAction( flowid, 11, null);。其中flowid是初始化时得到的流程id;11是<action>的id,这个id应该是全局唯一的;最后一个参数,是用来 给OSWorkflow传递参数用的外部输入。

以上就是OSWorkflow的基本使用,实际上最常用的就是2个方法:initialize和doAction。对于其他的方法和对象,请参见对应的javadoc。

8.         如何将持久化机制用于流程数据?

答:对于持久化的支持,OSWorkflow提供了WorkflowStore接 口,可以让使用者自己实现自定义的持久化机制。对于数据库,使用 JDBCStore即可。关于JDBCStore的配置主要集中于osworkflow.xml中,具体的配置方法,参见文档:1.4 Persistence Options。

9.         如何查询工作流?
答:主要的类型:
-          获得当前步骤和历史步骤列表:Workflow的getCurrentSteps和getHistorySteps。
-          获得当前可用的action:Workflow的getAvailableActions。

-          自定义查询:首先构造WorkflowExpressionQuery,然后使用Workflow的query。具体例子参见:文档5.4 Queries。

分享到:
评论

相关推荐

    OSWorkflow

    OSWorkflow

    OSWorkFlow

    1. 工作流模型:OSWorkFlow使用XML来定义工作流模型,包括任务(Task)、状态(State)、转换(Transition)等元素,这些元素共同构成了一个完整的工作流程。 2. 实例(Instance):当一个工作流模型被实例化后,就...

    工作流 osworkflow 例子和原理

    在实际开发中,我们可以通过以下步骤使用OSWorkflow: 1. 配置工作流定义:编写XML文件,定义流程的步骤、参与者、条件和动作。 2. 实现参与者接口:定义参与者类,处理每个步骤的业务逻辑。 3. 编写控制器:利用...

    osworkflow中文入门指南,osworkflow+hibernate+spring集成配置,osworkflow-2.8.0.jar

    在本入门指南中,我们将深入探讨如何使用osworkflow,并将其与流行的数据持久化框架Hibernate和依赖注入容器Spring进行集成。 **工作流管理系统** 是一种软件工具,它允许开发者定义、执行和管理业务流程。...

    osworkflow会议室使用申请DEMO.rar

    在这个“osworkflow会议室使用申请DEMO”中,我们可以深入理解如何利用OSWorkflow来实现一个简单的会议室使用申请流程。这个DEMO将帮助我们掌握OSWorkflow的核心概念,如工作流定义、状态转换以及角色参与等。 1. *...

    OSWorkflow中文手册 OSWorkflow中文手册

    本手册是OSWorkflow的中文版,旨在帮助中国用户更好地理解和使用这个工作流系统。 1. **工作流引擎基础** 工作流引擎是实现业务流程自动化的核心组件,它负责解析流程定义,驱动流程实例的执行,并管理流程的状态...

    osworkflow

    这个应用展示了如何在实际项目中部署和使用osWorkflow,帮助开发者快速上手。 **学习和使用建议** 1. **理解基础概念**:在深入学习之前,首先要理解工作流的基本概念,包括流程、状态、转换和参与者等。 2. **...

    osworkflow学习笔记

    通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!

    osworkflow2.8.pdf

    - **API 使用**:介绍了如何调用 OSWorkflow 的 API 来启动、控制和监控工作流。 #### 九、扩展与配置 - **OSWorkflow 包描述**:列举了 OSWorkflow 中各个包的作用和功能。 - **OSWorkflow 数据库描述**:详细...

    目前osworkflow最新最全的资料合集

    2. **OSWorkflow: A Guide for Java Developers and Architects.pdf**: 这本书可能是针对Java开发者和架构师的osworkflow指南,详细介绍了如何使用osworkflow设计和实现工作流。它可能涵盖了从基本概念到高级特性的...

    osworkflow2.8

    由于其基于 Java,OSWorkflow 可以轻松地与Spring、Hibernate等Java框架集成,也可以与Web服务、EJB等企业级技术配合使用。 8. **版本更新与社区支持** "2.8" 版本是OSWorkflow的一个稳定版本,但随着技术的发展...

    OSWorkflow源码及电子书

    本资源包含了OSWorkflow的源代码和相关电子书籍,对于学习和使用OSWorkflow来说,这是一个宝贵的资料库。 首先,让我们深入了解一下OSWorkflow的核心特性: 1. **灵活性**:OSWorkflow的最大亮点是其灵活性。它...

    osworkflow中文手册

    3. **工作流定义**:OSWorkflow使用XML来定义工作流,手册将详细介绍如何编写和配置工作流定义文件,包括定义步骤、分支、循环和事件。 4. **API使用**:手册会深入讲解OSWorkflow提供的Java API,包括如何启动工作...

    OsWorkflow工作流实例

    接下来,我们关注如何在代码中使用OsWorkflow。实例中的"testWorkflow"可能是一个包含流程定义和执行逻辑的项目。在OsWorkflow中,我们首先需要初始化工作流引擎,加载流程定义,然后创建一个新的实例并开始执行。...

    osworkflow_bundle2

    "osworkflow_bundle2" 是一个专门用于学习 OSWorkflow 的示例集合,它包含了一系列的资源和实例,帮助用户理解并掌握如何使用这个强大的工作流框架。在这个压缩包中,你将找到 "osworkflow_bundle" 文件,这是该学习...

    OSWorkflow中文手册 2.8

    本手册旨在提供详细的指导,帮助开发者理解和使用OSWorkflow。 #### 二、安装与配置 ##### 1. 必要文件 在使用OSWorkflow之前,需要准备一些基础文件: - **OSWorkflow核心库**:包含主要的功能实现。 - **...

    osworkflow指导文档 + 源码

    osWorkflow 是由 James Helzer 开发的,其设计目标是为 Java 应用程序提供一个轻量级、易于使用的流程管理框架。osWorkflow 支持动态流程更改、事件驱动的流程控制以及多种持久化机制,如 JNDI、XML 文件和数据库...

    Osworkflow10份资料

    OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及风暴—基础概念.doc 用osworkflow写一个请假例子.rar

    基于osworkflow框架的OA系统demo

    本DEMO是基于osworkflow框架构建的一个会议室使用申请的实例,旨在展示如何利用osworkflow来实现一个具体的办公自动化功能。 **1. osworkflow简介** OSWorkflow提供了强大的工作流定义和执行能力,包括流程设计、...

Global site tag (gtag.js) - Google Analytics