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

 

三、在工作流中使用事务

      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'.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
英文版 Windows Workflow Foundation (WF) is a revolutionary part of the .NET 4 Framework that allows you to orchestrate human and system interactions as a series of workflows that can be easily mapped, analyzed, adjusted, and implemented. As business problems become more complex, the need for workflow-based solutions has never been more evident. WF provides a simple and consistent way to model and implement complex problems. As a developer, you focus on developing the business logic for individual workflow tasks. The runtime handles the execution of those tasks after they have been composed into a workflow. Pro WF: Windows Workflow in .NET 4 provides you with the skills you need to incorporate WF in your applications, using a lively tutorial style with each example illustrated in C#. This book gets you up to speed with WF 4 quickly and comprehensively. Learn about WF 4s new designer, its updated programming paradigm, and the completely new set of activities that can enable and extend your workflows. This book also includes detailed coverage of how to customize your workflows and access them in a variety of ways and situations so you can maximize the advantages of this technology. What youll learn * WF 4 basics * New activities and changes to existing activities in WF 4 * Customizing your workflows * Accessing your workflows in a variety of ways in a variety of situations * Using WF with Web Services and ASP.NET * Integrating WCF and WF Who this book is for This book is for intermediate to advanced .NET developers who need to learn how to use the latest version of Windows Workflow Foundation (WF 4). This book is not a primer on .NET or the C# language. To get the most out of the examples presented in this book, it is necessary to have a good working knowledge of .NET 2.0 or higher. All of the examples are presented in C#. Table of Contents * A Quick Tour of Windows Workflow Foundation * Foundation Overview * Activities * Workflow Hosting * Procedural Flow Control * Collection-Related Activities * Flowchart Modeling Style * Host Communication * Workflow Services * Workflow Services Advanced Topics * Workflow Persistence * Customizing Workflow Persistence * Transactions, Compensation, and Exception Handling * Workflow Tracking * Enhancing the Design Experience * Advanced Custom Activities * Hosting the Workflow Designer * WF 3.x Interop and Migration
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值