首页 > 代码库 > WF4 持久化 <第四篇>
WF4 持久化 <第四篇>
一、基础示例
WF4 默认支持SQLServer的持续化,首先要执行目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的脚本:
- SqlPersistenceService_Schema.sql
- SqlPersistenceService_Logic.sql
还是Bookmark的示例,新建一个工作流如下:
其中,Bookmark代码如下:
public sealed class Bookmark1<T> : NativeActivity<T> { public InArgument<string> InParam { get; set; } protected override bool CanInduceIdle { get { return true; } } protected override void Execute(NativeActivityContext context) { this.Result.Set(context, "结果传出"); context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback)); } //恢复运行时的回调函数 void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj) { MessageBox.Show("恢复运行,传入的参数是:" + obj); //接收到的参数 this.Result.Set(context, (T)obj); } }
新建一个Winform程序如下:
代码如下:
public partial class Form1 : Form { WorkflowApplication instance = null; SqlWorkflowInstanceStore instanceStore = null; InstanceView view; Guid guid = new Guid(); public Form1() { InitializeComponent(); } public void InitialWorkflowApplication() { instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1()); instance.Idle = workflowIdel; //为挂起绑定事件 instance.Completed = workflowCompleted; //为完成绑定事件 instance.Unloaded = unload; string connectionString = "Data Source=CZZ;Initial Catalog=xxoo;Integrated Security=True"; instanceStore = new SqlWorkflowInstanceStore(connectionString); view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30)); instanceStore.DefaultInstanceOwner = view.InstanceOwner; instance.InstanceStore = instanceStore; } private void button1_Click(object sender, EventArgs e) { //初始化流程实例 InitialWorkflowApplication(); instance.Run(); } //持久化 private void button3_Click(object sender, EventArgs e) { guid = instance.Id; //只有绑定了InstanceStore的工作流才允许卸载 instance.Unload(); } //从数据库加载 private void button4_Click(object sender, EventArgs e) { //初始化流程实例 InitialWorkflowApplication(); instance.Load(guid); } //从书签处恢复执行 private void button2_Click(object sender, EventArgs e) { if (instance.GetBookmarks().Count() == 1) { BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[0].BookmarkName, "inPut"); MessageBox.Show("Bookmark恢复执行:" + BRR.ToString()); } } void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { MessageBox.Show("完成!"); } void workflowIdel(WorkflowApplicationIdleEventArgs e) { MessageBox.Show("挂起!"); } void unload(WorkflowApplicationEventArgs e) { MessageBox.Show("卸载!"); } }
点击启动工作流,流程执行至Bookmark挂起。点击持续化,作为示例,本处直接Unload()了,WF4在Unload之前会持续化一次。同时,数据库中多个表会发现增加了一行。
如果此时直接,恢复执行。由于工作流已被卸载,所以会报一个错误。所以,应该先点击加载Workflow,此时流程会根据Guid重新装载上次未执行完毕的流程继续执行。
二、SqlWorkflowInstanceStore
SqlWorkflowInstanceStore是WF4提供的一个类,需要赋值到WorkflowApplication实例的InstanceStore属性。
里面保存了数据库连接字符串以及流程所有者等信息。
可用内容如下:
方法/属性 | 说明 |
ConnectionString | 数据库连接字符串 |
DefaultInstanceOwner | 实例的所有者 |
HostLockRenewalPeriod | 指定时间段,宿主必须在该时间段内续订其在工作流服务实例上的锁 |
InstanceCompletionAction | 工作流实例完成后采取的操作。两个取值:DeleteAll、DeleteNothing(完成后删还是不删) |
InstanceEncodingOption | 是否必须对实例数据进行压缩 |
InstanceLockedExceptionAction | 当捕获InstanceLockedException时执行的操作 |
MaxConnectionRetries | 获取或设置最大 SQL 连接重试次数,默认值为 4 |
RunnableInstancesDetectionPeriod | 间隔多长时间执行检测任务。 |
Execute() | 持久化命令,需要时供提供程序操作 |
WF4 持久化 <第四篇>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。