posted @ 2008-02-01 23:41 navyliu 阅读(203) 评论(0) 编辑

CodeActivity

The Code Activity's only interesting feature is its ExecuteCode event.We can write some code in the event. When the Code Activity is activitied, the code will be executed.

It might seem useful to execute arbitrary code in a workflow, but in reality the Code activity should appear relatively infrequently and as a special case. Instead of using Code activities, we should look to package code into custom activities.

IfElseActivity

Inside an IfElse activity are one or more IfElseBranch activities. Each branch activity has a Condition property. We are required to o set the Condition property on all branches, except for the last branch.

分支的执行

IfElseActivity有多个分支,分支按从左向右执行,那个分支符合条件,就执行,如果没有分支满足条件,则跳出IfElseActivity,如果最后一个分支没有条件,则最后一个分支会执行(除非其他的分支不满足条件)。这个和程序语言的if类似。

添加分支

在IfElseActivity上点击右键,选择"Add Branch“可以添加分支。

条件设置

条件分为Code Condition和Declare Rule Condition两种。

WhileActivity

WhileActivity也有一个Condition,WhileActivity里面还可以包含一个其他的Activity,它包含的Activity会执行,直到Condition为True。 注意,While里面只能有一个Activity,如果想在WhileActivity中执行多个Activity,则可以把这些Activity放在下面的SequenceActivity中。

SequenceActivity

是一个复合的Activity(Composite Activity),里面可以包含至活动(Child Activity)。

SuspendActivity挂起活动

当一个工作流的流转过程中出现问题,需要人工干预的时候,可以将工作流挂起,这个时候Host应用程序可以订阅WFInstance的WorkflowSuspended事件,并通过查询WorkflowSuspendedEventArgs事件参数中的Error属性来获取工作流的异常信息,这个事件参数还包含有一个WorkflowInstance属性,Host可以通过补充相应的数据后重启工作流实例(利用WorkflowInstance的Resume方法),也可以调用Terminate方法终止一个WorkflowInstance。

TerminateActivity

和SuspendActivity类似,TerminateActivity也会停止工作流的运行,不过和SuspendActivity不同的是,一个Workflow被Terminate后,不能恢复。同样的,Host应用程序也可以订阅WorkflowInstance的WorkflowTerminated事件,通过WorkflowTerminatedEventArgs的Error属性获取工作流运行失败的信息,并可以把Error信息包装为WorkflowTerminatedException抛出。

TerminateActivity和ThrowActivity的区别:如果你想在WorkflowTerminated处理器中制定是那种异常,那么你需要用ThrowActivity,ThrowActivity让你有机会捕获一个抛出的异常,并继续,但TerminateActivity始终会抛出异常,并终止Workflow。

ThrowActivity

ThrowActivity的用法上面已经说了,当执行一个ThrowActivity后,Host可以通过订阅WorkflowTerminated事件来获取Throw的Exception。但是ThrowActivity抛出异常后,WorkflowInstance会继续执行。抛出的异常可以在ThrowActivity的Fault属性中指定。

InvokeWorkflowActivity

InvokeWorkflowActivity会一步的执行另外一个Workflow。执行是异步的,部门不能检索其他Workflow的输出参数。可以通过其他的与Host的通讯机制来获取输出参数。

我们可以把自己的工作流的属性或者字段作为参数与Target Workflow的Public属性绑定。在启动Target Workflow之前,当前的Workflow会触发一个Invoking的事件,我们可以在Invoking事件的处理器中组织和初始化相应的参数。

InvokeWorkflowActivity非常有用,它在很大程度上增强了流程的可重用性。

ParallelActivity

并行活动,顾名思义,它可以让ParallelActivity中的多个活动独立的执行,(但并不是不同的分支在多个线程中运行,实际上不同的分支还是在同一个线程里面运行)。可以用投票系统来解释ParallelActivity。多个投票分支,投票无先后约束,哪一个投票到了,Workflow就会处理,并继续侦听其他的投票,直到所有的投票都完成。(ParallelActivity要求所有的分支都完成,Activity才算完成)。(这个和Biztalk里面的是一样的)。

DelayActivity

等待一段时间。

ListenActivity

ListenActivity也有多个分支,和并行活动所不同的是,ListenActivity的分支中,只要有一个分支完成了,ListenActivity就算完成了。ListenActivity中常常有一个分支是DelayActivity,让Workflow等待一段时间,如果侦听的事件还没有触发,则结束侦听。

EventHandlingScopeActivity

事件处理范围活动也有多个分支并行的侦听和处理外部事件,但是和Listen和Parallel活动不同的是,它又一个main child activity,在main child activity执行前,所有的分支可以并行的处理,当main child activity执行后,EventHandlingScopeActivity就执行完毕。一个典型的例子是在规定的时间内统计投票,这里面main child activity是一个DelayActivity,设定为等待的时间。

SynchronizationScopeActivity

和.NET程序中的线程同步类似,SynchronizationScope Activity可以使得共享资源的访问串行化(甚至可以在workflow instances之间串行化)。如果在我们的workflow definition中有一个static的字段(在VB中是shared field),SynchronizationScopeActivity可以确保在此活动的持续期间,只有一个实例有该字段的读或者写权限。

ReplicatorActivity

如何使用ReplicatorActivity呢?ReplicatorActivity有点类似WhileActivity,但是比它更复杂。

posted @ 2008-02-01 23:34 navyliu 阅读(421) 评论(0) 编辑

There are three way we can comunicate with workflow:

  1. Event(将外面的数据传递给WF InstanceEvents are used for sending data to a workflow)
  2. Method(把WF Instance里面的数据传递给Host应用程序 is used by workflows to send data to the host application)
  3. Parameters(通过参数传递给WF Instance)

Workflow Instance Lifecycle Events

Name

Description

WorkflowAborted

Occurs when an instance aborts. The WorkflowInstance class includes an Abort method to abort a workflow.

WorkflowCompleted

Occurs when the instance completes, and includes a WorkflowCompletedEventArgs parameter to retrieve any output parameters.

WorkflowCreated

Occurs after we create a workflow with the WorkflowRuntime's CreateWorkflow method.

WorkflowIdled

Occurs when a workflow enters an idle state. A workflow becomes idle when it is waiting for a timer or external event to take place, for instance.

WorkflowLoaded

Occurs when a persistence service has restored a workflow instance into memory to continue execution.

WorkflowPersisted

Occurs when a persistence service persists a workflow. A workflow may persist and then unloaded from memory when it is in the idle state and waiting for an event.

WorkflowSuspended

Occurs when the runtime suspends a workflow, typically due to a SuspendActivity in the workflow.

WorkflowResumed

Occurs when workflow execution continues after a suspension.

WorkflowStarted

Occurs when a workflow firsts starts execution.

WorkflowTerminated

Occurs when a workflow terminates, typically due to an unhandled exception. WorkflowTerminatedEventArgs will include the exception object.

WorkflowUnloaded

Occurs when the runtime unloads a workflow from memory, typically due to the workflow being idle.

 
using local services in workflows
 
 

采用Event和Method实现WF与Hosting之间的通讯,需要一下几个步骤:

  1. Service Contracts服务契约,也就是服务的接口。需要定一个Interface,里面定义通讯所必需的方法,事件以及相应的参数,这里要强调的一点是,因为传递参数要跨应用程序域,所以参数必需是可以序列化的。该接口需要有一个[ExternalDataChange]特性。下面是一个Service Contracts的例子:

    [ExternalDataExchange]
    interface IBugFlowService
    {
    void AssignBug(Bug bug);
    event EventHandler<BugAddedArgs> BugAdded;
    }

    在事件中传递的事件参数必需是继承自ExternalDataEventArgs类的。

  2. Service的实现,需要实现1中定义的Service Contracts,这个实现没有很特别的。这里面要明晰两个概念就是,方法(Method)是WF Instance向Hosting中传递数据,事件(Event)是Hosting向WF Instance中发送数据。
  3. Workflow实现。上面我们讲了,方法是WF向外发送数据,事件是向WF发送数据。这些分别是用HandleExternalEventActivity 和CallExternalMethodActivity来实现的,HandleExternalEventActivity侦听Hosting中注册的LCS事件,当它所订阅的事件触发时,它能捕获事件,并做相应的处理。CallExternalMethodActivity是调用Hosting中的LCS的方法,并把数据传递给Hosting。

下面我对上面的HandleExternalEventActivity和CallExternalMethodActivity做一下分析。

HandleExternalEventActivity处理外部事件的活动

该活动既然是要处理外部事件,而这个外部事件是由注册到WF Runtime中的ExternalDataExchangeService来触发的。那么我们需要知道该活动是侦听哪个Service的哪个事件,事件传递的参数又要做如何处理等。

一个HandleExternalEventActivity必需设置的两个属性分别是InterfaceType和EventName。InterfaceType是要指定处理的是哪个Service,它必须是标注又ExternalDataChange特性的Interface。 EventName就是它里面相应的事件。当你指定事件后,VS会自动增加一个Parameter参数组,其中一个参数是e,是相应Event对应的事件参数,需要你指定事件参数的处理,你可以把事件参数赋值到WF中的一个字段或者属性。

HandleExternalEventActivity有一个事件,就是Invoked,这个就是用来处理外部的事件的,其中的事件参数就是相应Service传递进来的参数,可以在这个事件的处理程序中对Hosting传递进来的数据进行处理。

image

CallExternalMethodActivity调用外部的方法Activity

同样的,CallExternalMethodActivity也是调用注册到WF Runtime中的Service的方法,同样的思路,我们需要指定对应的InterfaceType以及MethodName。相应的Method的参数也需要进行指定,可以将Method的参数指定到WF的相关的属性(Property)或者字段(Field)。CallExternalMethodActivity在调用外部方法之前,会触发一个事件MethodInvoking,我们可以在这个事件中为外部方法的调用做一些准备工作,比如组织数据等。

Hosting的实现

下面是一个典型的通过LCS实现WF与Hosting之间通讯的例子:

 

//定义并初始化一个数据交换服务(ExternalDataExchangeService)    ExternalDataExchangeService dataService; dataService = new ExternalDataExchangeService();                                                                          

//把该数据交换服务添加到runtime中                                                      runtime.AddService(dataService);

//实例化一个Service Contract的实现,并把它添加到数据交换服务中
BugFlowService bugFlow = new BugFlowService();
dataService.AddService(bugFlow);

//启动工作流实例
WorkflowInstance instance;
instance = runtime.CreateWorkflow(typeof(BugFlow));
instance.Start();

//触发外部事件。
Bug bug = new Bug(1, "Bug Title", "Bug Description");
bugFlow.CreateBug(instance.InstanceId, bug);

下图是Programming Windows Workflow Foundation中的关于WF Instance与外界进行通讯的例子的示意图。可以看出:

1.WF Instance是通过ExternalDataExchangeService 来作中介实现数据交换,首先要把LCS 的实例添加到ExternalDataExchangeService中,而ExternalDataExchangeService 实例也添加到Runtime的Service中(通过AddService);

2.WF通过HandleExternalEventActivity相应外部的事件,内外部传递的参数必需是可序列化的。WF通过CallExternalMethodActivity来调用外部的方法。

 image

posted @ 2008-02-01 23:29 navyliu 阅读(332) 评论(0) 编辑