`

坚持学习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

    ASP.NET + WF4.0(Windows Workflow Foundation 4.0)数据持久化请假系统Demo是一个综合性的项目,展示了如何在Web应用中结合WF4.0技术处理业务流程,特别是请假申请这一具体场景。这个系统利用了ASP.NET作为前端...

    坚持学习WF(1):从HelloWorld开始 源码

    深入WF的学习,还需要掌握活动库的使用、自定义活动的创建、持久化机制、工作流服务(WF45中的WCF Workflow Service)以及与WF相关的设计模式。这将帮助你构建更复杂、灵活且适应性强的业务流程解决方案。 总结来说...

    WF 4.0 之持久化操作

    在工作流(WF)领域,特别是针对WF 4.0版本的理解中,“WF 4.0 之持久化操作”这一主题聚焦于如何有效地将工作流的状态保存下来,以便在后续的操作中能够继续执行。持久化操作对于构建健壮的工作流应用至关重要,...

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

    在这个"ASP.NET与工作流WF实现审批流程+数据持久化Demo"中,我们将会探讨如何在ASP.NET环境中利用WF创建审批流程,并实现数据在数据库中的持久化。 首先,让我们了解ASP.NET。ASP.NET是微软提供的一个用于构建动态...

    WF工作流学习资料

    2. **WF架构**:WF主要包括四个主要组件:设计时环境、运行时引擎、持久化服务和跟踪服务。设计时环境提供图形化的工具来创建和编辑工作流;运行时引擎负责执行工作流;持久化服务确保在需要时能保存和恢复工作流...

    持久化工作流示例

    在IT行业中,工作流(Workflow)是一种用于自动化业务流程的技术,它可以模拟并管理人们、系统和应用程序之间的交互...这个示例是学习WF持久化功能的一个很好的起点,它将帮助你理解和应用WF在实际项目中的持久化策略。

    Apress - Beginning WF: Windows Workflow in .NET 4.0 Mar 2010

    - **实现SQL持久化与自定义参与者**:探讨如何将工作流的状态保存到SQL数据库中,并介绍如何开发自定义参与者来扩展工作流的功能。 - **创建工作流扩展和自定义活动**:教授如何开发自定义的工作流活动和扩展,以...

    【翻译】WF从入门到精通(第一章):WF简介源代码下载

    持久化则允许WF将工作流的状态保存到存储中,以便在需要时恢复,这对于处理长时间运行或跨会话的工作流至关重要。 WF支持四种基本的工作流类型:顺序工作流、状态机工作流、事务工作流和并行工作流。顺序工作流按照...

    wf4cookbook中文

    WF4的核心概念包括活动(Activity)、工作流(Workflow)、运行时(Runtime)和持久化(Persistence)。活动是WF4的基本构建块,代表工作流中的一个可执行单元,可以是内置的简单操作,也可以是复杂的自定义逻辑。...

    WF学习从入门到提高

    "WF学习从入门到提高"的主题涵盖了从基础知识到高级技巧的全面学习路径,适合对WF感兴趣或需要在工作中应用WF技术的初学者和进阶者。 在WF的学习过程中,首先要理解的是WF的基本概念。WF提供了一种模型化的方式来...

    Beginning WF Windows Workflow in .NET 4.0

    在.NET 4.0中,WF引入了许多新特性,如活动库的增强、更灵活的数据绑定机制、改进的持久化支持等,使得工作流的开发变得更加高效和强大。 #### 2. 工作流概念与模型 书中详细解释了工作流的基本概念,包括流程图、...

    wf工作流资料<转自网上的笔记>

    "坚持学习WF(6)开发可复用的宿主程序"则涉及如何将工作流集成到实际应用中,讲解了宿主的概念和如何创建一个能够启动、管理和持久化工作流实例的应用程序。 "坚持学习WF(9)本地服务之事件处理"探讨了WF中的事件处理...

    pro wf windows workflow in dot net 3.5

    9. **工作流持久性框架**:介绍了WF的持久性接口和策略,以及如何实现自定义持久化提供者,以满足特定存储需求。 10. **案例研究**:书中可能包含多个实际应用场景,如订单处理、审批流程等,以帮助读者将理论知识...

    (2007 Apress)Pro WF Windows Workflow in .NET3.0.pdf

    - **持久化**:WF支持将工作流的状态保存到持久存储中,以便在后续时刻恢复执行。 #### 5. 技术细节 - **编程模型**:WF支持两种主要的编程模型:顺序工作流和状态机工作流。 - **集成能力**:WF可以轻松地与其他...

    WF从入门到精通(源码)

    5. **数据持久化**:WF支持工作流实例的持久化,即在内存中的工作流状态可以保存到数据库或其他持久化存储中,以便在后续需要时恢复。这是处理长时间运行工作流的关键特性。 6. **规则引擎**:WF内置了规则引擎,...

Global site tag (gtag.js) - Google Analytics