`

坚持学习WF(13):WF中的持久化服务

阅读更多

[置顶]坚持学习WF文章索引

工作流系统中有很大一部分需要和人进行交互,有的时候需要很长的时间,所以我们不可能让工作流实例一直保存在内存当中,这就需要进行持久化操作。工作流的持久化就是保存工作流的某些状态信息到持久化存储里,比如sql数据库,文件中,一旦被保存到持久化存储里了,工作流就可以从内存中移除掉,在需要的时候在进行装载。

插一句,在Lotus Notes中由于他的设计和数据都是以文档的形式存储在一个nsf中的,所以他天生就对持久化支持,只要我们做简单的做一个FileSave或是Call doc.Save(True,True)就会被持久存储,也正是如此,我们很多关于工作流的状态信息我们都存储在每个数据文档本身当中,可在.Net,Java这些当中却还需要花费很大的力气和DB等交互才可以完成,两种不同风格的开发对比起来确实挺有意思。

持久化服务是WF中核心服务之一,WF框架提供一个标准的持久化服务SqlWorkflowPersistenceService,利用它可以将工作流状态信息存放在Sql Server数据库中,你也可以自己实现持久化服务,你必须继承自WorkflowPersistenceService这个类,自定义的持久化服务可以把数据存储在二进制文件,xml,其他关系型数据库中等等,但是一个工作流实例一次只能使用一个持久化服务。

一旦你将持久化服务加载到工作流引擎中,你就不需要手动去干涉了,他会自动的完成相应的操作。在以下状态的时候,工作流会被持久化。

1. idle的时候(如等待外部事件,使用DelayActivity)。

2. 工作流完成或终止。

3. 当TransactionScopeActivity完成的时候。

4. 当CompensatableSequenceActivity完成的时候。

5. 当一个装饰有PersistOnCloseAttribute的自定义活动完成的时候。

6. 当你手动的去调用Unload或TryUnload方法的时候。

如果你使用DelayActivity的时候,持久化服务也会存储DelayActivity的过期时间,并且持久化服务会定期检查是否过期,以准备从新恢复工作流状态,SqlWorkflowPersistenceService有一个LoadingInterval属性可以设置获取加载间隔的长度。

有的时候当工作流变成idle的时候,你也可以选择不进行持久化存储,这种情况适合当你等待的外部事件比较频繁,而且事件很快就被接收的时候,因为这个时候如果你在进行持久化存储,你花在卸载和装载上时间会更多,还不如不进行持久化存储呢。

下面我们完成一个例子来说如何使用SqlWorkflowPersistenceService:

1.首先我们需要建立我们的持久化数据库,WF已提供了响应sql脚本,位置如下:

[WindowsFolder]\Microsoft.Net\Framework\v3.0\Windows Workflow Foundation\SQL\[language].[windows]这里面有SqlPersistenceService_Schema.sql和SqlPersistenceService_Logic.sql两个文件用来生成持久化数据库.

创建好的持久化数据库里包含两张表, InstanceState和 CompletedScope,InstanceState表中记录未完成事例的运行状态,CompletedScope表记录当工做流使用事务的支持。

2.定义两个事件

2.1.首先定义IPersistenceDemo接口:

[ExternalDataExchange]
public interface IPersistenceDemo
{
    event EventHandler<ExternalDataEventArgs> ContinueReceived;
    event EventHandler<ExternalDataEventArgs> StopReceived;
}
2.2.实现本地服务PersistenceDemoService:
public class PersistenceDemoService : IPersistenceDemo
{       
   public event EventHandler<ExternalDataEventArgs> ContinueReceived;
   public event EventHandler<ExternalDataEventArgs> StopReceived;
      
   public void OnContinueReceived(ExternalDataEventArgs args)
   {
      if (ContinueReceived != null)
      {
           ContinueReceived(null, args);
      }
   }       
   public void OnStopReceived(ExternalDataEventArgs args)
   {
      if (StopReceived != null)
      {
           StopReceived(null, args);
      }
   }        
}
 
3.实现工作流,如下图:
SqlPersistence1 
3.1.whileActivity的条件为!this.IsComplete
3.2.heeContinue和heeStop分别接收我们定义的ContinueReceived和StopReceived事件。
代码如下:
public sealed partial class PersistenceDemoWorkflow: SequentialWorkflowActivity
{
    private Boolean isComplete = false;

    public Boolean IsComplete
    {
        get { return isComplete; }
        set { isComplete = value; }
    }
    public PersistenceDemoWorkflow()
    {
        InitializeComponent();
    }
    private void handleStopReceived_Invoked(object sender, ExternalDataEventArgs e)
    {
        //tell the WhileActivity to stop
        isComplete = true;
    }
}
 
4.实现宿主程序
4.1.首先增加一个类来显示工作流状态
public class Workflow
{
   private Guid instanceId = Guid.Empty;
   private String statusMessage = String.Empty;
   private Boolean isCompleted;

   public Guid InstanceId
   {
       get { return instanceId; }
       set { instanceId = value; }
   }

   public String StatusMessage
   {
       get { return statusMessage; }
       set { statusMessage = value; }
   }

   public Boolean IsCompleted
   {
        get { return isCompleted; }
        set { isCompleted = value; }
   }
}
4.2.这次我们使用的是一个windows form的程序,完成的效果如下:
SqlPersistence2 
当我们创建一个工作流实例后,我们看到他的StatusMessage从Created-Ilded-Persisted-Unloaded变化,这是由于工
作流执行到ListenActivity中等待事件的时候,期状态会变成ilded,当ilded的时候工作流实例的状态信息将被持久化存
储到Sql数据中,状态从Persisted变成Unloaded,这个时候即使你关闭程序也没有关系,如果你点击继续按钮,
StatusMessage的变化为Loaded-Ilded-Persisted-Unloaded,他会从新从数据库中装载被持久化的工作流,点击停止
后会变成Completed状态。
持久化后我们关闭应用程序在重写打开的时候会调用如下方法来加载所有的工作流实例,主要使用了GetAllWorkflows来获
所有工作流实例。
private void RetrieveExistingWorkflows()
{
   workflows.Clear();       
   foreach (SqlPersistenceWorkflowInstanceDescription workflowDesc
            in ((SqlWorkflowPersistenceService)persistence).GetAllWorkflows())
   {
        Workflow workflow = new Workflow();
        workflow.InstanceId = workflowDesc.WorkflowInstanceId;
        workflow.StatusMessage = "Unloaded";
        workflows.Add(workflow.InstanceId, workflow);
   }
   if (workflows.Count > 0)
   {
        RefreshData();
   }
}
在宿主程序我们定义如下方法来加载SqlWorkflowPersistenceService和本地服务,SqlWorkflowPersistenceService
类的一些成员方法的使用差MSDN吧,
private void AddServices(WorkflowRuntime instance) { //use the standard SQL Server persistence service String connStringPersistence = String.Format("Initial Catalog={0};Data Source={1};Integrated Security={2};", "WorkflowPersistence", @"localhost\SQLEXPRESS", "SSPI"); persistence = new SqlWorkflowPersistenceService(connStringPersistence, true, new TimeSpan(0, 2, 0), new TimeSpan(0, 0, 5)); instance.AddService(persistence); //add the external data exchange service to the runtime ExternalDataExchangeService exchangeService = new ExternalDataExchangeService(); instance.AddService(exchangeService); //add our local service persistenceDemoService = new PersistenceDemoService(); exchangeService.AddService(persistenceDemoService); }
其他的代码基本都是围绕着实现StatusMessage自动变化的,和工作流关系不大。
代码下载:PersistenceDemo
分享到:
评论

相关推荐

    坚持学习WF,WF学习教程

    坚持学习WF(13):WF中的持久化服务 主要介绍了如何使用WF中提供的SqlWorkflowPersistenceService来进行持久化存储。 坚持学习WF(14):自定义持久化服务 我们除了使用WF提供的SqlWorkflowPersistenceService外,还...

    坚持学习WF

    坚持学习WF(13):WF中的持久化服务 主要介绍了如何使用WF中提供的SqlWorkflowPersistenceService来进行持久化存储。 坚持学习WF(14):自定义持久化服务 我们除了使用WF提供的SqlWorkflowPersistenceService外,还可以...

    ASP.net+WF4.0数据持久化请假系统Demo

    该资源需要安装sql server 2008,运用WF4.0的新特性实现了一个简单的请假系统,并实现了WF4.0的数据持久化

    WF 4.0 之持久化操作

    如果WF不能持久化,那么流程就需要一次就执行完毕,所有的操作就要一次走下去,如果不能持久化,那么在流程中需要处理的公共数据,可能为简单类型,也可能为复杂类型)则完全不同,甚至说每个人都是不一样的,我们要...

    ASP.NET与工作流WF实现审批流程+数据持久化Demo

    需要安装SQL2008和vs2010 实现了利用WF进行流程审批的简单demo,并实现了数据持久化..

    工作流 C# Wf

    WF的全称是Windows Workflow Foundation,是...WF不是一个独立的工作流应用程序,它提供了一些类库用于辅助工作流应用程序的开发,并提供了实现工作流应用程序时所需要实现的一些机制,比如持久化、补偿、跟踪机制等。

    Beginning+WF4.0应用到 asp.net源码实例

    wf4.0应用asp.net 这个示例将包括WF4.0的大部分知识点。包括: 1、持久化服务 2、跟踪服务 3、自定义扩展 4、WCF Workflow Service 5、WorkflowServiceHost 6、使用Interop活动去调用WF3.0工作流程

    持久化工作流示例

    使用Vs2012+C#开发的工作流持久化示例,原文链接:http://blog.csdn.net/mathieuxiao/article/details/8586025

    WF俄罗斯方块

    Winfron窗口制作的小游戏 俄罗斯方块 欢迎大家下载试玩

    WF 状态机 订单处理的源代码

    很不错的一个基于WF,用状态机实现的工作流例子,实现持久化服务,运行时管理,人工调度服务。。。

    Beginning WF 4.0

    第一部分 简介 1 第一章 创建一个简单的工作流 1 ...第十一章 SQL持久化 152 第十二章 扩展 164 第十三章 跟踪 164 第十四章 事务 165 第十五章 事务与持久化 165 第十六章 WorkServiceHost 165 。。。。。

    WorkFlowCHM.CHM

    (十九) Persistence 持久化 (二十) ActivityWithResult 有返回值Activity (二十一) WorkflowInvoker (二十二) Tracking (二十三) 范型Activity (二十四) Async Activity (二十五) ActivityAction 与 InvokeAction ...

    wpf源码大全 精通C#3.0图书源码 详细源码 学习好用

    PersistenceDemo 持久化服务使用示例。 SimpleTrackingSample 简单的追踪服务示例。 第22章(\C22) 示例描述:本章详细分析了一个基于WF的工作流批核系统。 WorkflowApprovalDemo 城市电力和照明工作...

    countersignature.rar

    WF 处理流程 本例将实现如下功能 一组与业务相关的Activity ...持久化,以便在WF宿主重新启动后可以继续以前的流程 一个通过WCF进行通讯的WPF客户端 WF的状态表 注:本例没有提供组织结构体系,用户权限系统的演示

    Microsoft Windows Workflow Foundation 4.0

    wf 4.0 全解讲解 从基础的活动、持久化、服务、自定义设计器

    .Net.Framework3.5开发技术详解[中文][PDF][VOL1]

    作为初学入门选择方向的好教材 许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新...19.5 工作流的持久化 406 19.6 工作流的XAML表示 407

    .Net.Framework3.5开发技术详解[中文][共二卷][PDF][VOL2]

    作为初学入门选择方向的好教材 许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新...19.5 工作流的持久化 406 19.6 工作流的XAML表示 407

    C#与.NET3.5高级程序设计第四版.pdf

    WF不是一个独立的工作流应用程序,它提供了一些类库用于辅助工作流应用程序的开发,并提供了实现工作流应用程序时所需要实现的一些机制,比如持久化、补偿、跟踪机制等。WCF是远程通讯技术,其传承了SOA设计的优势。

Global site tag (gtag.js) - Google Analytics