VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • 坚持学习WF18使用IPendingwork接口

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  WF会定期在各个持久性点(Persistence Point)检查并将工作流实例保存到持久化存储中,这样如果工作流出现错误或是异常终止时相关的信息就会被存储,下次加载工作流实例时就会从此做为开始点。这个主要是针对工作内置的服务。工作流的外部服务使用工作批次来保留状态信息。 这些服务对其工作项进行批处理并共享与工作流的事务相同的事务。 如果工作流尚未提交事务,则服务仍可以在持久点期间对某些工作项进行批处理。WF提供 IWorkBatch 和 IPendingWork 以帮助服务和工作流实例保留状态信息。

  我们先来看一个简单的例子

  一:首先定义一个本地服务IBatchedServices.cs,其中定义了一个DoSomeWork的方法,用于给工作流添加一个挂起的工作项,代码如下:

using System;
using System.Workflow.Activities;
namespace CaryIPendingWorkDemo
{
  [ExternalDataExchange]
  public interface IBatchedServices
  {
    void DoSomeWork(String message);
  }
}

  二:下面实现该本地服务BatchedService.cs,代码如下:

using System;
using System.Collections;
using System.Workflow.Runtime;
using System.Transactions;
namespace CaryIPendingWorkDemo
{
  public class BatchedService : IBatchedServices, IPendingWork
  {
    public void DoSomeWork(string message)
    {      
      WorkflowEnvironment.WorkBatch.Add(this, message);
    } 
    public void Commit(Transaction transaction, ICollection items)
    {
      foreach (Object item in items)
      {
        Console.WriteLine("Commiting: {0}", item.ToString());
      }
    }
    public void Complete(bool succeeded, ICollection items)
    {
      if (succeeded)
      {
        Console.WriteLine("Complete: Transaction succeeded");
      }
      else
      {
        Console.WriteLine(
          "Complete: Transaction aborted. Need to rollback");
        foreach (Object item in items)
        {
          Console.WriteLine("Rolling Back: {0}", item.ToString());
        }
      }
    }
    public bool MustCommit(ICollection items)
    {
      Console.WriteLine("Returning true for MustCommit");
      return true;
    }    
  }
}
1.类BatchedService实现了IBatchedServices, IPendingWork接口。2.WorkflowEnvironment.WorkBatch 属性表示获取当前工作批次。Add方法可以将挂起的工作项添加到此工作批次,以便运行时引擎可以在单个事务中提交所有相关的工作项。本例我们只是使用简单的字符串来做演示。3.下面就是实现IPendingWork的方法,我们来看下他的各个成员  Commit:使用指定的 Transaction 对象提交工作项的列表.  Complete:事务完成后调用.  MustCommit:允许工作批次中的项断言它们是否必须立即提交.

编缉推荐阅读以下文章

  • 暂无相关文章
 

  三:实现工作流,如下图

坚持学习WF(18):使用IPendingWork接口

  工作流的设计很简单,首先拖一个TransactionScopeActivity,然后想其中添加三个CallExternalMethodActivity分别设置他们的属性,如上图即可。

  四:宿主程序如下:

using System;
using System.Configuration;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Runtime.Hosting;
using Bukovics.Workflow.Hosting;
using SharedWorkflows;
namespace CaryIPendingWorkDemo
{
  public class BatchedWorkTest
  {
    public static void Run()
    {
      using (WorkflowRuntimeManager manager
        = new WorkflowRuntimeManager(new WorkflowRuntime()))
      {
        AddServices(manager.WorkflowRuntime);
        manager.WorkflowRuntime.StartRuntime();
        Console.WriteLine("Executing BatchedWorkWorkflow");
        manager.StartWorkflow(
          typeof(SharedWorkflows.BatchedWorkWorkflow), null);
        manager.WaitAll(100000);
        Console.WriteLine("Completed BatchedWorkWorkflownr");
      }
    }
    private static void AddServices(WorkflowRuntime instance)
    {
      SqlWorkflowPersistenceService persistence =new SqlWorkflowPersistenceService(
       ConfigurationManager.ConnectionStrings["WorkflowPersistence"].ConnectionString,
          true, new TimeSpan(0, 2, 0), new TimeSpan(0, 0, 5));
      instance.AddService(persistence);
      ExternalDataExchangeService exchangeService = new ExternalDataExchangeService();
      instance.AddService(exchangeService);
      exchangeService.AddService(new BatchedService());
    }
  }
}

编缉推荐阅读以下文章

  • 暂无相关文章
 

  五:程序运行结果如下图:

坚持学习WF(18):使用IPendingWork接口

  当TransactionScopeActivity完成时,事务被提交。然后建立持久化点(persistence point。使用持久化服务类保存工作流实例的信息。

  IPendingWork提交。下面是MSDN中的描述:

  调用组件时的操作顺序

  1. 在初始化期间,工作流创建一个工作批次。

  2. 工作流将工作批次附加到对组件的方法调用中。 通过使用 WorkflowEnvironment 类,服务可以访问其任何方法中的工作批次。

  提交点处的操作顺序

  1. 工作流创建一个事务。

  2. 工作流循环访问工作批次并收集组件的所有工作项(保持顺序)以创建工作批次。 工作流传入事务和工作批次,调用组件上的 Commit 方法。

  3. 组件将工作批次中的工作添加到事务。

  4. 对工作项在工作批次中的所有组件重复第 2 步和第 3 步。

  5. 当 Commit 通知成功时,工作流提交对应的事务。

  6. 成功提交事务后,工作流循环访问工作批次并收集每个组件的所有工作项(如第 2 步所述)。工作流传入对应的事务和工作批次,调用每个组件的 Complete 方法。

  对工作流错误的操作顺序

  1. 工作流标识所有与出错范围相关的工作项并构建一个工作批次。

  2. 工作流调用每个唯一的、将工作批次中所有工作的完成状态设置为 false 的 IPendingWork 的 Complete 方法。

  3. 如果工作批次属于 TransactionScopeActivity 活动或 CompensatingTransactionScopeActivity 活动的子上下文,则工作流放弃工作批次中的所有工作。

  4. 从错误恢复后,运行时保持对所有剩余工作批次项的引用。 随后,可能会在将来的持久点提交该工作。

编缉推荐阅读以下文章

  • 暂无相关文章
 

  三:实现工作流,如下图

坚持学习WF(18):使用IPendingWork接口

  工作流的设计很简单,首先拖一个TransactionScopeActivity,然后想其中添加三个CallExternalMethodActivity分别设置他们的属性,如上图即可。

  四:宿主程序如下:

using System;
using System.Configuration;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Runtime.Hosting;
using Bukovics.Workflow.Hosting;
using SharedWorkflows;
namespace CaryIPendingWorkDemo
{
  public class BatchedWorkTest
  {
    public static void Run()
    {
      using (WorkflowRuntimeManager manager
        = new WorkflowRuntimeManager(new WorkflowRuntime()))
      {
        AddServices(manager.WorkflowRuntime);
        manager.WorkflowRuntime.StartRuntime();
        Console.WriteLine("Executing BatchedWorkWorkflow");
        manager.StartWorkflow(
          typeof(SharedWorkflows.BatchedWorkWorkflow), null);
        manager.WaitAll(100000);
        Console.WriteLine("Completed BatchedWorkWorkflownr");
      }
    }
    private static void AddServices(WorkflowRuntime instance)
    {
      SqlWorkflowPersistenceService persistence =new SqlWorkflowPersistenceService(
       ConfigurationManager.ConnectionStrings["WorkflowPersistence"].ConnectionString,
          true, new TimeSpan(0, 2, 0), new TimeSpan(0, 0, 5));
      instance.AddService(persistence);
      ExternalDataExchangeService exchangeService = new ExternalDataExchangeService();
      instance.AddService(exchangeService);
      exchangeService.AddService(new BatchedService());
    }
  }
}

 


相关教程