`
j2eemaster
  • 浏览: 9084 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

网摘 osworkflow入门

阅读更多
 

 osworkflow入门

<o:p> </o:p>

<o:p> </o:p>

这篇指导资料的目的是介绍OSWorkflow的所有概念,指导你如何使用它,并且保证你逐步理解OSWorkflow的关键内容。

<o:p> </o:p>

本指导资料假定你已经部署OSWorkflow的范例应用在你的container上。范例应用部署是使用基于内存的数据存储,这样你不需要担心如何配置其他持久化的例子。范例应用的目的是为了说明如何应用OSWorkflow,一旦你精通了OSWorkflow的流程定义描述符概念和要素,应该能通过阅读这些流程定义文件而了解实际的流程。

<o:p> </o:p>

本指导资料目前有3部分:

1. 你的第一个工作流

2. 测试你的工作流

3. 更多的流程定义描述符概念

<o:p> </o:p>

<o:p> </o:p>

1. Your first workflow

创建描述符

首先,让我们来定义工作流。你可以使用任何名字来命名工作流。一个工作流对应一个XML格式的定义文件。让我们来开始新建一个“myworkflow.xml”的文件,这是样板文件:

<o:p> </o:p>

<!----><!---->   "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"  "http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">

<workflow></workflow> 

<initial-actions></initial-actions>    ...   

<steps></steps>    ... 

首先是标准的XML头部,要注意的是OSWorkflow将会通过这些指定的DTD来验证XML内容的合法性。你可以使用绝大多数的XML编辑工具来编辑它,并且可以highlight相应的错误。

<o:p> </o:p>

步骤和动作

接下来我们来定义初始化动作和步骤。首先需要理解的OSWorkflow重要概念是steps (步骤) actions (动作)。一个步骤是工作流所处的位置,比如一个简单的工作流过程,它可能从一个步骤流转到另外一个步骤(或者有时候还是停留在一样的步骤)。举例来说,一个文档管理系统的流程,它的步骤名称可能有“First Draft - 草案初稿”,“Edit Stage -编辑阶段”,“At publisher - 出版商”等。

<o:p> </o:p>

动作指定了可能发生在步骤内的转变,通常会导致步骤的变更。在我们的文件管理系统中,在“草案初稿”这个步骤可能有“start first draft - 开始草案初稿”和“complete first draft - 完成草案初稿”这样2个动作。

<o:p> </o:p>

简单的说,步骤是“在哪里”,动作是“可以去哪里”。

<o:p> </o:p>

初始化步骤是一种特殊类型的步骤,它用来启动工作流。在一个工作流程开始前,它是没有状态,不处在任何一个步骤,用户必须采取某些动作才能开始这个流程。这些特殊步骤被定义在 <initial-actions></initial-actions>

<o:p> </o:p>

在我们的例子里面,假定只有一个简单的初始化步骤:“Start Workflow”,它的定义在里面<initial-actions></initial-actions>

<o:p> </o:p>

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

<results></results>   

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

 

这个动作是最简单的类型,只是简单地指明了下一个我们要去的步骤和状态。

<o:p> </o:p>

工作流状态

工作流状态是一个用来描述工作流程中具体步骤状态的字符串。在我们的文档管理系统中,在“草案初稿”这个步骤可能有2个不同的状态:“Underway - 进行中”和“Queued - 等候处理中”

<o:p> </o:p>

我们使用“Queued”指明这个条目已经被排入“First Draft”步骤的队列。比如说某人请求编写某篇文档,但是还没有指定作者,那么这个文档在“First Draft”步骤的状态就是“Queued”。“Underway”状态被用来指明一个作者已经挑选了一篇文档开始撰写,而且可能正在锁定这篇文档。

<o:p> </o:p>

第一个步骤

让我们来看第一个步骤是怎样被定义在<steps></steps>元素中的。我们有2个动作:第一个动作是保持当前步骤不变,只是改变了状态到“Underway”,第二个动作是移动到工作流的下一步骤。我们来添加如下的内容到<steps></steps>元素:

<o:p> </o:p>

<step id="1" name="First Draft"></step> 

<actions></actions>   

<action id="1" name="Start First Draft"></action>     

<results></results>       

<unconditional-result style="COLOR: red"></unconditional-result>old-status="Finished"  status="Underway" step="1"/>     

   

   

<action id="2" name="Finish First Draft"></action>     

<results></results>      

 <unconditional-result style="COLOR: red"></unconditional-result>old-status="Finished"   status="Queued" step="2"/>         

 

<step id="2" name="finished"></step>

这样我们就定义了2个动作,old-status属性是用来指明当前步骤完成以后的状态是什么,在大多数的应用中,通常用"Finished"表示。

<o:p> </o:p>

上面定义的这2个动作是没有任何限制的。比如,一个用户可以调用action 2而不用先调用action 1。很明显的,我们如果没有开始撰写草稿,是不可能去完成一个草稿的。同样的,上面的定义也允许你开始撰写草稿多次,这也是毫无意义的。我们也没有做任何的处理去限制其他用户完成别人的草稿。这些都应该需要想办法避免。

<o:p> </o:p>

让我们来一次解决这些问题。首先,我们需要指定只有工作流的状态为“Queued”的时候,一个caller (调用者)才能开始撰写草稿的动作。这样就可以阻止其他用户多次调用开始撰写草稿的动作。我们需要指定动作的约束,约束是由Condition(条件)组成。

<o:p> </o:p>

条件

OSWorkflow 有很多有用的内置条件可以使用。在此相关的条件是“StatusCondition - 状态条件”。 条件也可以接受参数,参数的名称通常被定义在javadocs里(如果是使用Java Class实现的条件的话)。在这个例子里面,状态条件接受一个名为“status”的参数,指明了需要检查的状态条件。我们可以从下面的xml定义里面清楚的理解:

<o:p> </o:p>

<action id="1" name="Start First Draft"></action> 

<restrict-to></restrict-to>   

<conditions></conditions>     

<condition type="class"></condition>       

<arg name="class.name"></arg>          com.opensymphony.workflow.util.StatusCondition       

<arg name="status"></arg>Queued    

    

 

 

<results></results>   

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

希望对于条件的理解现在已经清楚了。上面的条件定义保证了动作1只能在当前状态为“Queued”的时候才能被调用,也就是说在初始化动作被调用以后。

<o:p> </o:p>

函数

接下来,我们想在一个用户开始撰写草稿以后,设置他为“owner”。为了达到这样的目的,我们需要做2件事情:

<o:p> </o:p>

1) 通过一个函数设置“caller”变量在当前的环境设置里。

2) 根据“caller”变量来设置“owner”属性。

<o:p> </o:p>

函数是OSWorkflow的一个功能强大的特性。函数基本上是一个在工作流程中的工作单位,他不会影响到流程本身。举例来说,你可能有一个“SendEmail”的函数,用来在某些特定的流程流转发生时来发送email提醒。

<o:p> </o:p>

函数也可以用来添加变量到当前的环境设置里。变量是一个指定名称的对象,可以用来在工作流中被以后的函数或者脚本使用。

<o:p> </o:p>

OSWorkflow提供了一些内置的常用函数。其中一个称为“Caller”,这个函数会获得当前调用工作流的用户,并把它放入一个名为“caller”的字符型变量中。

<o:p> </o:p>

因为我们需要追踪是哪个用户开始了编写草稿,所以可以使用这个函数来修改我们的动作定义:

<o:p> </o:p>

<action id="1" name="Start First Draft"></action> 

<pre-functions></pre-functions>    

<function type="class"></function>     

<arg name="class.name"></arg>      com.opensymphony.workflow.util.Caller     

 

<results></results>   

<unconditional-result style="mso-spacerun: yes" old-status="Finished" status="Underway"></unconditional-result>     step="1" owner="${caller}"/> 

h3 组合起来

把这些概念都组合起来,这样我们就有了动作1

<o:p> </o:p>

<action id="1" name="Start First Draft"></action> 

<restrict-to></restrict-to>   

<conditions></conditions>     

<condition type="class"></condition>       

<arg name="class.name"></arg>          com.opensymphony.workflow.util.StatusCondition       

       

<arg name="status"></arg>Queued     

    

  

<pre-functions></pre-functions>    

<function type="class"></function>     

<arg name="class.name"></arg>        com.opensymphony.workflow.util.Caller         

 

 

<results></results>   

<unconditional-result style="mso-spacerun: yes" old-status="Finished" status="Underway"></unconditional-result>     step="1"  owner="${caller}"/> 

我们使用类似想法来设置动作2

<o:p> </o:p>

<action id="2" name="Finish First Draft"></action> 

<restrict-to></restrict-to>   

<conditions type="AND"></conditions>     

<condition type="class"></condition>       

<arg name="class.name"></arg>          com.opensymphony.workflow.util.StatusCondition               

<arg name="status"></arg>Underway     

     

<condition type="class"></condition>       

<arg name="class.name"></arg>          com.opensymphony.workflow.util.AllowOwnerOnlyCondition                

 

 <results></results>   

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

在这里我们指定了一个新的条件:“allow owner only”。这样能够保证只有开始撰写这份草稿的用户才能完成它。而状态条件确保了只有在“Underway”状态下的流程才能调用“finish first draft”动作。

<o:p> </o:p>

把他们组合在一起,我们就有了第一个流程定义:

<o:p> </o:p>

<!----><!---->   "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"  "http://www.opensymphony.com/osworkflow/workflow_2_7.dtd"><workflow></workflow>  <initial-actions></initial-actions>    <action id="1" name="Start Workflow"></action>      <results></results>        <unconditional-result style="mso-spacerun: yes" old-status="Finished"></unconditional-result>        status="Queued" step="1"/>             <steps></steps>    <step id="1" name="First Draft"></step>      <actions></actions>        <action id="1" name="Start First Draft"></action>          <restrict-to></restrict-to>            <conditions></conditions>              <condition type="class"></condition>                <arg name="class.name"></arg>                   com.opensymphony.workflow.util.StatusCondition                                <arg name="status"></arg>Queued                                              <pre-functions></pre-functions>             <function type="class"></function>              <arg name="class.name"></arg>                 com.opensymphony.workflow.util.Caller                                              <results></results>            <unconditional-result style="mso-spacerun: yes" old-status="Finished" status="Underway"></unconditional-result>             step="1"  owner="${caller}"/>                          <action id="2" name="Finish First Draft"></action>          <restrict-to></restrict-to>            <conditions type="AND"></conditions>              <condition type="class"></condition>                <arg name="class.name"></arg>                    com.opensymphony.workflow.util.StatusCondition                                <arg name="status"></arg>Underway                            <condition type="class"></condition>                <arg name="class.name"></arg>                  com.opensymphony.workflow.util.                  AllowOwnerOnlyCondition                                                              <results></results>            <unconditional-result style="mso-spacerun: yes" old-status="Finished"></unconditional-result>            status="Queued" step="2"/>                                <step id="2" name="finished"></step> 

现在这个工作流的定义已经完整了,让我们来测试和检查它的运行。

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

2. Testing your workflow<o:p></o:p>

现在我们已经完成了一个完整的工作流定义,下一步是检验它是否按照我们预想的方式执行。

<o:p> </o:p>

在一个快速开发环境中,最简单的方法就是写一个测试案例。通过测试案例调用工作流,根据校验结果和捕捉可能发生的错误,来保证流程定义的正确性。

<o:p> </o:p>

我们假设你已经熟悉Junit和了解怎样编写测试案例。如果你对这些知识还不了解的话,可以去JUnit的网站查找、阅读相关文档。编写测试案例会成为你的一个非常有用的工具。

<o:p> </o:p>

在开始载入流程定义、调用动作以前,我们需要配置OSWorkflow的数据存储方式和定义文件的位置等。

<o:p> </o:p>

配置 osworkflow.xml

我们需要创建的第一个文件是 osworkflow.xml。子:

<o:p> </o:p>

<osworkflow></osworkflow> 

<persistence class="com.opensymphony.workflow.&amp;lt;span style="></persistence>   spi.memory.MemoryWorkflowStore"/> 

<o:p> </o:p>

<factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory"></factory>    <property key="resource" value="workflows.xml"></property>  

 

这个例子指明了我们准备使用内存 (MemoryWorkflowStore) 来保存流程数据。这样可以减少设置数据库的相关信息,减少出问题的可能性。用内存持久化对于测试来说是非常方便的。

<o:p> </o:p>

Workflow factories

上面的配置文件还指明了我们工作流工厂(XMLWorkflowFactory),工作流工厂的主要功能是管理流程定义文件,包括读取定义文件和修改定义文件的功能。通过'resource'这个属性指明了采用通过从classpath中读取流程定义文件的方式,按照这个定义,接下来我们需要在classpath中创建一个名为workflows.xml的文件。

<o:p> </o:p>

workflows.xml 的内容:

<o:p> </o:p>

<workflows></workflows> 

<workflow name="mytest" type="resource" location="myworkflow.xml"></workflow>

我们把 myworkflow.xml workflows.xml放在同一目录,这样它就能够被工作流工厂读取了。

<o:p> </o:p>

这样就完成了配置,接下来是初始化一个流程并调用它。

<o:p> </o:p>

Initialising OSWorkflow

OSWorkflow 的调用模式相当简单:通过一个主要的接口来执行大部分操作。这个接口就是 Workflow interface,及其扩展 AbstractWorkflow 的实现,例如EJBWorkflow SOAPWorkflow. 为了简单起见,我们使用最基本的一种: BasicWorkflow

<o:p> </o:p>

首先,我们来创建Workflow。在实际项目中,这个对象应该被放在一个全局的位置上以供重用,因为每次都创建一个新的Workflow对象是需要耗费比较昂贵的系统资源。在这里的例子,我们采用BasicWorkflow,它的构建器由一个当前调用者的用户名构成,当然我们很少看到单用户的工作流应用,可以参考其他的Workflow实现有不同的方式去获得当前调用者。

<o:p> </o:p>

为了简单起见,我们采用BasicWorkflow来创建一个单一的用户模式,避免编写其他获取用户方法的麻烦。

<o:p> </o:p>

这样我们来创建一个'testuser'调用的workflow:

<o:p> </o:p>

Workflow workflow = new BasicWorkflow("testuser");

下一步是提供配置文件,在大多数情况下,只是简单的传递一个DefaultConfiguration实例:

<o:p> </o:p>

DefaultConfiguration config = new DefaultConfiguration();

workflow.setConfiguration(config);

现在我们已经创建并且配置好了一个workflow,接下来就是开始调用它了。

<o:p> </o:p>

启动和进行一个工作流程

首先我们需要调用initialize 方法来启动一个工作流程,这个方法有3个参数,workflow name (定义在workflows.xml里,通过workflow factory处理), action ID (我们要调用的初始化动作的ID),和初始化变量。 因为在例子里面不需初始化变量,所以我们只是传递一个null

分享到:
评论
1 楼 liu78778 2009-03-04  
不是我说你, 排版太差, 看的受不了

相关推荐

    OSWorkFlow入门指南及其中文手册.zip

    这个压缩包包含了两份重要的资源:《osworkflow中文手册.pdf》和《OSWorkFlow入门指南.pdf》,都是帮助开发者理解和使用OSWorkFlow的重要参考资料。 OSWorkFlow的核心概念是工作流,这是一种用于自动化组织中的业务...

    Osworkflow 入门级例子

    这个入门级的例子将带你了解 Osworkflow2.8 的基本概念和如何在项目中简单地实现工作流。 Osworkflow 提供了一个强大的框架,允许开发者定义、执行和控制业务流程。它的核心功能包括流程定义、流程实例管理、任务...

    OSWorkFlow入门指南.pdf

    总之,OSWorkflow入门指南的目标是引导开发者了解工作流的基本概念,学会如何创建工作流描述符,以及如何利用OSWorkflow框架来构建和测试工作流。通过学习这个入门指南,开发者将能够深入理解OSWorkflow框架,掌握其...

    OSWorkFlow入门指南.doc

    这篇入门指南将引导你了解 OSWorkflow 的基本概念、如何创建和测试工作流,以及更深入的流程定义描述符概念。 首先,OSWorkflow 的核心概念包括工作流(workflow)、步骤(steps)和动作(actions)。工作流是一个...

    OSWorkFlow入门

    **OSWorkflow 入门指南** OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个框架提供了灵活的流程定义、状态跟踪、任务分配以及事件通知等功能,使得开发人员能够轻松地创建和...

    osworkflow入门范例

    使用方法:把mine压缩包解压,把osworkflow-2.8.0-example文件夹放入%TOMCAT_HOME%\webapp下。osworkflow-2.8.0-example.xml放在%TOMCAT_HOME%\conf\Catalina\localhost 当然数据库要配置连接池,名字为jdbc/...

    OSWorkflow快速入门

    OSWorkflow 快速入门 OSWorkflow 是一个轻量级的工作流引擎,虽然相较于其他如JBPM等流行框架,它的更新维护并不频繁,但它以其简单、灵活和可扩展性获得了开发者们的青睐。它不包含图形化的流程设计器,但在2.8...

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

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

    osworkflow入门例子

    这篇入门指南主要面向初学者,旨在帮助他们快速理解和使用 OSWorkflow。以下是对文中知识点的详细解释: 1. **工作流定义**:OSWorkflow 的核心是工作流定义,它是一个 XML 文件,描述了工作流程的各个步骤和转换。...

    OSWorkFlow入门例子[归类].pdf

    在 OSWorkflow 中,每个步骤可以有多个动作,这些动作定义了从该步骤到其他步骤或状态的转移。每个动作通过 &lt;results&gt; 元素定义其结果,其中 &lt;unconditional-result&gt; 表示无论什么条件都执行的结果。old-status 和 ...

    OSWorkflow演示例子

    OSWorkflow(OpenSymphony Workflow)是一款开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个"OSWorkflow演示例子"提供了如何使用OSWorkflow的实际示例,帮助开发者更好地理解和应用这一工具。...

    OSWorkflow

    OSWorkflow

    OSWorkFlow

    OSWorkFlow是一个基于Java的工作流引擎,用于在企业级应用中实现复杂的业务流程自动化。它提供了灵活的流程定义和执行模型,使得开发者可以方便地设计、实施和管理各种工作流。下面将详细介绍OSWorkFlow的核心概念、...

    OSWorkflow中文手册 OSWorkflow中文手册

    OSWorkflow是一款开源的工作流引擎,主要用于管理应用程序中的复杂业务流程。这款工具提供了强大的工作流建模、执行和跟踪功能,让开发者能够灵活地定义和控制应用程序的流程逻辑。本手册是OSWorkflow的中文版,旨在...

    workflow_osworkflow_工作流_

    **OSWorkflow入门** 入门OSWorkflow,首先需要理解其基本概念: 1. **步骤(Steps)**:工作流中的一个操作阶段,每个步骤由一个或多个参与者(Actors)执行。 2. **参与者(Actors)**:可以是用户、角色或者系统...

    osworkflow

    **osWorkflow 概述** osWorkflow 是一个开源的工作流管理系统,专为 Java 应用程序设计,用于处理复杂的业务流程。这个系统的核心功能是管理、跟踪和执行一系列步骤,这些步骤构成了一个工作流程。osWorkflow 提供...

    OSWorkflow源码及电子书

    1. **入门教程**:介绍如何安装和配置OSWorkflow,以及如何创建第一个工作流实例。 2. **API参考**:详细说明了OSWorkflow的各个类和接口,帮助开发者理解和使用API进行开发。 3. **最佳实践**:提供一些实际案例和...

    osworkflow2.8.pdf

    这种方式虽然增加了入门门槛,但也提供了更强大的定制能力。 - **挑战**:由于缺乏直观的可视化工具,初学者可能需要一定时间才能掌握如何有效地编写流程定义文件。这意味着开发者需要具备一定的编程基础,能够理解...

Global site tag (gtag.js) - Google Analytics