配置 workflow.xml

我们需要创建的第一个文件是 workflow.xml。下面是一个简单的例子:

<workflow>

  <persistence type="DotNetTools.Workflow.Spi.Memory.MemoryWorkflowStore,DotNetTools.Workflow"/>

  <factory type="DotNetTools.Workflow.Loader.XMLWorkflowFactory">

    <property key="resource" value="workflows.xml" />

  </factory>

</workflow>


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

Workflow factories

 

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

workflows.xml
的内容:

<workflows>

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

</workflows>


我们把 workflow.xml myworkflow.xml workflows.xml放在同一目录(通常是build输出目录),这样它就能够被工作流工厂读取了。请参阅workflow 配置文件

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

Initialising Workflow

 

Workflow 的调用模式相当简单:通过一个主要的接口来执行大部分操作。这个接口就是 IWorkflow interface,及其扩展 AbstractWorkflow 的实现,例如BasicWorkflow. 为了简单起见,我们使用最基本的一种: BasicWorkflow
首先,我们来创建Workflow。在实际项目中,这个对象应该被放在一个全局的位置上以供重用,因为每次都创建一个新的Workflow对象是需要耗费比较昂贵的系统资源。在这里的例子,我们采用BasicWorkflow,它的构建器由一个当前调用者的用户名构成,当然我们很少看到单用户的工作流应用,可以参考其他的Workflow实现有不同的方式去获得当前调用者。

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

IWorkflow workflow = new BasicWorkflow("testuser");

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

 

 

DefaultConfiguration config = new DefaultConfiguration();

workflow.Configuration=config;


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

启动和进行一个工作流程

 

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

long workflowId = workflow.Initialize("mytest", 1, null);


我们现在已经有了一个工作流实例,返回的workflowId可以在后续的操作中来代表这个实例。这个参数会在Workflow interface的绝大部分方法中用到。

检验工作流

 


现在让我们来检验启动的工作流实例是否按照我们所预期的那样运行。根据流程定义,我们期望的当前步骤是第一步,而且应该可以执行第一个动作(开始编写草稿)。

 

 

                     IList currentSteps = workflow.GetCurrentSteps(workflowId);

                     //校验只有一个当前步骤

                     Assert.AreEqual( 1, currentSteps.Count,"Unexpected number of current steps");

                     //校验这个步骤是1

                     IStep currentStep = (IStep)currentSteps[0];

                     Assert.AreEqual(1, currentStep.StepId,"Unexpected current step");

 

 

                     int[] availableActions = workflow.GetAvailableActions(workflowId);

                     //校验只有一个可执行的动作

 

 

                     Assert.AreEqual( 1, availableActions.Length,"Unexpected number of available actions");

                     //校验这个动作是2

                     Assert.AreEqual(2, availableActions[0],"Unexpected available action");


h4
执行动作

现在已经校验完了工作流实例正如我们所期望的到了第一个步骤,让我们来开始执行第一个动作:

       workflow.DoAction(workflowId, 2, null);


        
这是简单的调用第一个动作,工作流引擎根据指定的条件,改变状态到‘Underway’,并且保持在当前步骤。

现在我们可以类似地调用第2个动作,它所需要的条件已经都满足了。
在调用完第2个动作以后,根据流程定义就没有可用的动作了,GetAvailableActions将会返回一个空数组。

Congratulations,
你已经完成了一个工作流定义并且成功地调用了它。下一节我们将会讲解workflow一些更深入的概念。

posted on 2006-07-17 20:50  榻榻米  阅读(1323)  评论(0)    收藏  举报