Windows WorkFlow Foundation 入门之三(在工作流中使用事务)

来源:互联网 发布:ios9cydia软件源闪退 编辑:程序博客网 时间:2024/06/07 01:30

 

三、在工作流中使用事务

      WF提供的TransactionScopeActivity封装了.NET System.Transactions的事务功能,可以在操作发生错误时自动回滚,从而支持从事务失败中恢复。请参考MSDN中获取System.Transactions.TransactionSystem.Transactions.TransactionScope类的更详细信息。 

 

工作流中的批处理状态信息

      工作流会周期性在各个检查点保存它有状态,如果发生错误,工作流引擎有必要检索保存过的信息来返回到一个稳定的状态。如果两个以上的组件正在通信,那么组件间的coordinate persistence有助于保证组件的一致性。      

      这一点在发送或接收消息时尤其有用。例如,一个工作流可能发送多条消息,每个发送的操作都会请求消息服务。消息服务必须要维护工作流的一致性和持续的状态,只有工作流状态被成功保存,消息才能被发送。这意味着在单个的事务中,工作流状态以及消息发送状态都会被保存起来,以保存所有组件间状态的一致性。

         WF提供了System.Workflow.Runtime.IWorkBatch System.Workflow.Runtime.IpendingWork两个接口来解决这个问题。

     在对服务所有调用中,运行时引擎在自己的线程上下文中提供了System.Workflow.Runtime.IworkBatch,你可以添加一个挂起的工作项到批处理中,这样运行时引擎可以一次性将所有相关的工作项提交到事务处理。

      ExternalDataEventArgs的构造函数中,可以传递一个IpendingWork类型的参数。

 

 当组件被请求时的执行顺序

     1、在第一次请求前,工作流创建工作批处理对象。
      2
、工作流将工作批处理传对象递到到组件的请求方法中。
      3
、组件创建一个工作项,并将其添加到工作批处理对象中。

   
其它组件请求时,重复第二步和第三步。

在事务提交点的执行顺序

      1、工作流创建一个事务
      2
、工作流遍历工作批处理对象中的工作项,并收集其中属于某一组件的工作项,维护其顺序,然后创建一个新工作批处理对象。工作流调用组件的Commit方法,并把事务对象和这个批处理对象传递给它。
      3
、组件把工作批处理对象中的工作添加到事务中。

      对所有的组件重复第二步和第二步。

 

   当组件的Commnit方法成功调有后,工作注提交相应的事务。

   当事务成功提交后,工作流遍历工作批处理中工作项,如第二步一样。工作流调用每个组件的Complete方法,交把事务对象和批处理对象传递给它。

工作流发生错误时的执行顺序

 

    1工作流识别错误范围内的所有工作项并构造一个工作批处理对象,并将这些工作项添加这个工作批处理对象中。对于2、工作批处理中所有工作,工作流通过IPendingWork接口来调用其Complete方法,并传递完成状态为false

    3、工作流取消工作批处理中的所有工作。

   从错误中恢复后,运行时维护剩余的工作批处理项引用。

WF中的错误处理

      WF中的错误是以异步的方式来处理的。在活动中显式或隐式的抛出异常后,工作流运行时引擎会将捕捉到的异常先保存到队列中,在之后的时间再进行处理。这与一般的异常处理方式不同在于,如果一个异常在try{}语句块中被抛出,在相应的catch{}语句块中无法截获该错误,同时该错误也不会立即抛出给用户。

 异常的起因

      
以下几种情况可能会产生异常

·         原子事务超时

·         其它类型的事务失败

·         宿主程序通过ThrowActivity抛出异常

·         用户代码错误。当工作流调用外部的用户代码时,CLR类可能会抛出异常,如果这种异常在用户代码中没有被处理,它们最终会以工作流异常的的表式出现。

·         其它类型的系统异常,例如保存失败,.net或系统异常,或数据转换错误等

异常捕获

      错误处理中,如果抛出异常的活动不能处理它,异常会被转交到它的上一级活动处理,直到它被处理为止,否则的话,工作流实例就会被工作流运行时引擎终止。

      错误处理是由FaultHandlerActivity活动来完成的。每个FaultHandlerActivity活动都与一个.net异常类型相关联,并且它包含一系列的活动,如果错误类型与某个FaultHandlerActivity关联的错误类型匹配的话,就会执行为个FaultHandlerActivity活动。一个FaultHandlersActivity活动包含0-nFaultHandlersActivity子活动,FaultHandlersActivity可以是任何复合活动的子活动。

      WF中的错误处理通常被视为一个反向的工作,因为它的目标是当异常发生时,撤销活动中不成功的部分的工作。FaultHandlerActivity的执行完成不能被认为是事务活动的成功完成。事务活动会先被设置成错误状态,然后是关闭状态。任何兄弟活动同样会被取消。同时,compensation也会成为不可用状态。


在工作流中使用Compensation(下面译为补偿)

      WF中对于已完成事务的补偿模式,是对工作流中出现的异常进行处理的过程,并且会在逻辑上撤销已完成的事务。
      WF
补偿有以下两种形式:
      
当异常没有被处理的时候,系统隐式的补偿;
      
使用Compensate活动进行显式的补偿。


在工作流中使用动态更新

      动态更新使得我们可以在工作流实例运行的时候对它做出改变。做这些改变,可能是由于设计时候的疏忽,或者是属性的改变,活动的绑定,或者是业务逻辑得到了加强和完善。如果你需要整个改变工作流,动态更新并不适用,否则会导致工作流与最初的设计原则完全不同。在这种情况下,你应该设计一个新的工作流。

      动态更新适用于工作流的单个实例。如果已经有工作流实例运行,不能对工作流中的进行类型的改变。

      
你可以使用动态更新来干面的事情:

·         改变正在运行的工作流实例; 

·         改变运行时行为; 

·         改变工作流结构,例如,添加或移除一个活动; 

·         改变流程控制; 

·         为对一个已经存在的活动定义一个新的条件; 

·         改变一个PolicyActivityRuleSet 

·         如果在工作流在已经部署和运行后, 需要在工作流中增加一个新的业务过程,可以通过添加一个新的自定义活动,或InvokeWorkflowActivity活动来实现; 

·         添加一个新的EventDrivenActivity来响应一个新的事件,如一个附加的确认步骤;

      对一个正在运行的工作流进行动态更新,可能会导致两个不同的入口点:一个在工作流代码文件内,一个在工作流外,如工作流宿主程序。


工作流中的数据交换

      WF通信服务支持在工作流服务环境内的数据交换,它使得工作流可以以方法和事件的形式,与外部系统通过消息进行通信。
      WF
通过web serivce通信来实现工作流之间的数据交换。


 
在工作流中使用角色

      WF提供了一种基于角色的访问机制,适用于所有支持数据输入的活动。工作流的创建者有完全的控制权限来创建角色和角色集合。创建者通过这种方式,可以提供一种必要的权限机制,在活动被执行之前,来检测访问者角色的权限。

      有一些WF活动,如WebServiceInputActivity,通过其属性就可以取得或设置角色集合。
使用活动目录(Active Directory,),可以使得工作流的开发更加容易,WF通过一种被称为out-of-the-box的机制,来创建基于活动目录的角色。请参考MSDN,了解更多关于.net framework和活动目录的安全机制。
与角色相关的类有WebWorkflowRoleWorkflowRoleActiveDirectoryRole等等,在System.Workflow.Activities命名空间中。

编译工作流

      工作流可以通过以下三种方式被创建:

      
通过工作流markup文件,使用工作流markup,该文件的后缀为.xoml。通过宿主程序,把该文件传入给工作流运行时引擎,这种方式被称为无代码工作流创建,这种方式下,工作流不需要编译。被创建的文件名WorkflowSample.xoml(举例)

      
另一种方式是,markup文件用来声明工作流,然后与包含逻辑实现的代码一起被编译。这种方式被称为代码分离工作流创建。被创建的文件名为:WorkflowSample.xoml WorkflowSample.xoml.cs

      
在代码文件中使用WF对象模型。这种方式称为仅代码工作流创建。被创建的文件名为:WorkflowSample.cs WorkflowSample.Designer.cs,这些文件会被编译。

      
当工作流被编译时,会执行以下过程:

·         验证工作流活动是否符合为该活动设置的规则,如果验证产生错误,编译器会返回一个错误列表;

·         据传入到编译器中的标记(markup)定义,创建一个partial类;

·         从标记文件产生的partial类和人代码文件产生的partial类,被送入到.net编译器,这个过程的输出结果就是一个.net 程序集。文件名如:WorkflowSample.dll,可以被部署运行工作流了。
 

 在命令行中使用wfc.exe

      WF提供了命令行方式的工作流编译器,即wfc.exeWF同样提供一系列的支持工作流编译公共类型,可以用来开发自定义的工作流编译器。这些公共类型也是wfc.exe所用来的类型。你可以通过WorkflowCompiler类来创建一个自定义的编译器。

      你还可以使用WorkflowCompiler类来编译工作流,例如:

WorkflowCompiler compiler = new WorkflowCompiler(); 
WorkflowCompilerParameters param = 
new WorkflowCompilerParameters(); 
compiler.Compile(param, 
new string[] { "MainWorkflow.xoml" });

wfc.exe编译选项

   wfc命令行的选项如下 
Microsoft (R) Windows Workflow Compiler version 3.0.0.0
Copyright (C) Microsoft Corporation 2005. All rights reserved.
 
                 Windows Workflow Compiler Options
 
wfc.exe <XAML file> /target:codegen [/language:...]
wfc.exe <XAML file list> /target:assembly [<vb/cs file list>] [/language:...]
        [/out:...] [/reference:...] [/library:...] [/debug:...] [/nocode:...] [/checktypes:...]
 
                        - OUTPUT FILE -
/out:<file>             Output file name
/target:assembly        Build a Windows Workflow assembly (default).
                        Short form: /t:assembly
/target:exe             Build a Windows Workflow application.
                        Short form: /t:exe
/target:codegen         Generate partial class definition.
                        Short form: /t:codegen
/delaysign[+|-]         Delay-sign the assembly using only the public portion
                        of the strong name key.
/keyfile:<file>         Specifies a strong name key file.
/keycontainer:<string>  Specifies a strong name key container.
 
                        - INPUT FILES -
<XAML file list>        XAML source file name(s).
<vb/cs file list>       Code file name(s).
/reference:<file list>  Reference metadata from the specified assembly file(s).
                        Short form is '/r:'.
/library:<path list>    Set of directories where to lookup for the references.
                        Short form is '/lib:'.
 
                        - CODE GENERATION -
/debug[+|-]             Emit full debugging information. The default is '+'.
                        Short form is '/d:'.
/nocode[+|-]            Disallow code-separation and code-within models.
                        The default is '-'. Short form is '/nc:'.
/checktypes[+|-]        Check for permitted types in wfc.exe.config file.
                        The default is '-'. Short form is '/ct:'.
 
                        - LANGUAGE -
/language:[cs|vb]       The language to use for the generated class.
                        The default is 'CS' (C#). Short form is '/l:'.
/rootnamespace:<string> Specifies the root Namespace for all type declarations.
                        Valid only for 'VB' (Visual Basic) language.
                        Short form is '/rns:'.
 
                        - MISCELLANEOUS -
/help                   Display this usage message. Short form is '/?'.
/nologo                 Suppress compiler copyright message. Short form is '/n'.
/nowarn                 Ignore compiler warnings. Short form is '/w'.

 

原创粉丝点击