• WF4.0 基础篇 (十六) CompensableActivity 补偿


    本节主要介绍WF4的补偿

     

    本文例子下载:

    https://files.cnblogs.com/foundation/CompensableWorkflow.rar

    本文例子说明

    CompensableActivity 补偿容器

    补偿使用户可以指定对基于身体活动的成功完成后发生的活动的活动而须采取纠正行动

     

    CompensableActivity 补偿容器

     

    类名

    System.Activities.Statements.CompensableActivity

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity<CompensationToken>

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel]

    override 了 [CanInduceIdle 属性]

    [Variables] 属性 的类型为[Collection<Variable>]

     

    [Body] 属性 的类型为[Activity]

    [CancellationHandler] 属性 的类型为[Activity]

    [CompensationHandler] 属性 的类型为[Activity]

    [ConfirmationHandler] 属性 的类型为[Activity]

    返回值为 System.Activities.Statements.CompensationToken

    功能说明

    [CompensableActivity]中可以定义变量

    [CompensableActivity] 是补偿容器,在[CompensableActivity] 中的如下四个容器

     

    [Body]容器,主体

    [CancellationHandler]容器,产生[Cancel]行为时调用

    [CompensationHandler]容器,当显式调用[Compensate]或流程异常完成时调用

    [ConfirmationHandler]容器,当显式调用[Confirm]或流程正常完成时调用

     

     

    Compensate 补偿

    类名

    System.Activities.Statements.Compensate

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel]

    [Target] 属性 的类型为[System.Activities.Statements.CompensationToken]

    功能说明

    [Compensate 补偿] 用来显式调用[ CompensableActivity] 的 [CompensationHandler]

     

     

    Confirm 确认

    类名

    System.Activities.Statements.Confirm

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法]与[Cancel]

    [Target] 属性 的类型为[System.Activities.Statements.CompensationToken]

    功能说明

    [Confirm 确认]用来显式调用[ CompensableActivity] 的 [ConfirmationHandler]

     

     

    CompensableActivity容器 自动执行

    ConfirmationHandler 的自动执行

    当流程完成时会自动调用所有[CompensableActivity]中的ConfirmationHandler

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    //==============================================================

    static void confirmWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new ConfirmWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

     

    instance.Run();

    }

    结果

     

     

     

    CompensationHandler 的自动执行

    只有为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时

    当流程在[CompensableActivity]的外部产生异常,才会自动调用[CompensableActivity]中的CompensationHandler

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    //==============================================================

    static void compensateWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new CompensateWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

     

    instance.Run();

    }

    结果

    不为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

     

     

     

    CancellationHandler 的使用

    只有为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时

    当流程在[CompensableActivity]的[Body]部分产生异常,才会自动调用[CompensableActivity]中的CompensationHandler

     

    CancellationHandler与 CompensationHandler的区别

    1.当异常发生在[CompensableActivity]外部时,会调用 [CompensationHandler]

    2.当异常发生在[CompensableActivity.Body]部分时,会调用 [CancellationHandler]

    3.[CompensationHandler]可以被[Compensate] 显示调用

     

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    //==============================================================

     

    #region //Cancel 例子

    static void cancelWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new CancelWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

     

    instance.Run();

    }

     

    #endregion

    结果

    不为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

     

     

    CompensableActivity 显示调用

    使用[Confirm]可以显示调用[CompensableActivity]的[ConfirmationHandler]部分

    使用[Compensate]可以显示调用[CompensableActivity]的[CompensationHandler]部分

     

    要显示调用[CompensableActivity],需要定义一个[ System.Activities.Statements.CompensationToken]型变量,将[CompensableActivity]的[Result]绑定到该变量上.再将[Confirm]或[Compensate]的[Target]属性绑定到该变量上即可实现显示调用

    一个[CompensableActivity]只能被调用一次.调用两次以上会出错

    如果[Confirm]调用后,[Compensate]再调用会出错

    如果[Compensate]调用后,[Confirm]再调用会出错

    [Confirm]或[Compensate]调用后,不会再被自动调用

     

    Confirm 的使用

    当在流程中用[Confirm]调用其所对应的[CompensableActivity]的[ConfirmationHandler]时,[ConfirmationHandler]中的内容会被立即执行,这与自动调用不同

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    //==============================================================

     

    static void confirmCallWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new ConfirmCallWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

     

    instance.Run();

    }

     

    结果

     

    Compensate 的使用

    当在流程中用[Compensate]调用其所对应的[CompensableActivity]的[CompensationHandle]时,[CompensationHandle]中的内容会被立即执行,这与自动调用不同

    显示调用[Compensate]时,不需要为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    //==============================================================

    static void compensateCallWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new CompensateCallWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

     

    instance.Run();

    }

     

    结果

     

     

     

     

     

    多个/嵌套 CompensableActivity 容器

    无异常时

    如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]执行顺序是:

    在同级别容器中,是从下向上[ConfirmationHandler],在嵌套容器中是从外向内[ConfirmationHandler]

     

    有异常,但异常不在CompensableActivity中时

    如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]与[CompensationHandler]执行顺序是:

     

    1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].

    [CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]

     

    异常在CompensableActivity中时

    如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler][CompensationHandler]与[CancellationHandler]执行顺序是:

     

    1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].

    [CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]

     

    2.如果产生异常的[Activity]与[CompensableActivity]具有[父子孙]的直接层级关系,会调用这些具有[父子孙]直接层级关系[CompensableActivity]的[CancellationHandler]

     

     

     

     

     

     

    TerminateWorkflow 不会触发CompensableActivity的任何行为

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    //==============================================================

    #region //Terminate 例子

    static void terminateWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new TerminateWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

     

    instance.Run();

    }

    #endregion

    结果

     

     

  • 相关阅读:
    注册、登录、忘记密码实战
    python3错误:format() takes at most 2 arguments
    Charles手机抓包简要步骤
    VARCHAR2(N CHAR)与VARCHAR2(N)的区别
    关于VI一些常用的操作
    LINUX下 基于 Socket 的 UDP 和 TCP 编程具体实现
    VC++6.0实现文本格式的转换保存
    crt的sftp使用用于Windows与Linux之间的通讯
    pl/sql 导出脚本与使用
    在oracle10g下启动服务报 Permission denied错误解决方法
  • 原文地址:https://www.cnblogs.com/foundation/p/1638028.html
Copyright © 2020-2023  润新知