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:允许工作批次中的项断言它们是否必须立即提交.
三:实现工作流,如下图
工作流的设计很简单,首先拖一个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 BatchedWorkWorkflow\n\r"); } } 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()); } } }
五:程序运行结果如下图:
当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. 从错误恢复后,运行时保持对所有剩余工作批次项的引用。 随后,可能会在将来的持久点提交该工作。
发表评论
-
平淡的2007
2007-12-24 08:04 813早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1410今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 887[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 633[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 781[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1141[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 918当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 834Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 841在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 692我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1176MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 701本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 829本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 754WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1054由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 792[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 686[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 729[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1098一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 944首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
坚持学习WF(18):使用IPendingWork接口 WF会定期在各个持久性点(Persistence Point)检查并将工作流实例保存到持久化存储中,这样如果工作流出现错误或是异常终止时相关的信息就会被存储,下次加载工作流实例时就会...
坚持学习WF(18):使用IPendingWork接口 WF会定期在各个持久性点(Persistence Point)检查并将工作流实例保存到持久化存储中,这样如果工作流出现错误或是异常终止时相关的信息就会被存储,下次加载工作流实例时就会...
基于springboot个人公务员考试管理系统源码数据库文档.zip
bimdata_api_client-4.2.1-py3-none-any.whl
numpy-1.20.2-cp39-cp39-linux_armv7l.whl
matplotlib-3.3.2-cp39-cp39-linux_armv7l.whl
bimdata_api_client-4.0.0-py3-none-any.whl
ta_lib-0.5.1-cp312-cp312-win32.whl
基于springboot的非学勿扰学习交流平台源码数据库文档.zip
基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip
pillow-10.4.0-cp311-cp311-linux_armv7l.whl
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
基于springboot+web的学生作业管理系统源码数据库文档.zip
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
基于springboot网上书店源码数据库文档.zip
numpy-2.1.3-cp311-cp311-linux_armv7l.whl
基于springboot的校园消费点评系统源码数据库文档.zip
ta_lib-0.5.1-cp37-cp37m-win32.whl
Java高校学生信息管理系统源码 一、源码介绍 高校学生信息管理系统设计主要应用JAVA语言编程和mysql数据库连接等相关知识,需要熟练掌握Struts2、Spring、Hibernate基础 二、主要功能 高校学生信息管理系统设计主要应用JAVA语言编程和mysql数据库连接等相关知识,需要熟练掌握Struts2、Spring、Hibernate基础,将所 学知识在生活中灵活运用,高校学生信息管理系统的主要设计功能如下: (1)学生信息管理模块:包括所有学生信息的查询(用分页列表显示)、查看某个学生的详细信息、删除某学生信息、修改某学生信息以及学生信息的录入等子功能 (2)学生成绩管理模块:包括成绩信息录入、学生成绩查询、查看某个学生的成绩表以及删除学生
opencv_python-4.4.0.42-cp39-cp39-linux_armv7l.whl