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() 持久化命令,需要时供提供程序操作
时间: 2025-02-01 15:41:15

WF4 持久化 <第四篇>的相关文章

cocos2d-x 3.2 之 2048 —— 第四篇 ★ 核心 ★

***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 大家十一过得肿么样啊~ 我现在的情况就是--每逢佳节 胖三斤 啊 ,胖三斤..o(╯□╰)o.. 好了,继续做2048, 这是第四篇啦~ 这篇的内容就是对触摸的处理哟~ 就是,你上下左右滑动,相应移动~ 我们先在 游戏的宏定义类 中,建立一个枚举方向变量: Game

第十四篇 现象

第十四篇  现象 "现象"的产生是由宇宙当中各种因素交汇的结果.现象是万物在宇宙中的展现,它可以被人为创造,也可以由宇宙规律自行产生.现象能帮助人类逐步地了解宇宙的本质,也能帮助人类更好地了解自己. 当一个生命对宇宙有足够高度的认识之后就会留意所有的现象,并从这些现象当中去探索自身以及宇宙的奥秘.可以说,生命的成长过程就是不断地分析与探索各种现象,从而总结经验,让自身不断提高探索宇宙奥秘能力的一个历练过程. 随着对各种现象的不断分析与探索,人类会越来越深刻地认识到现象背后的本质,而不会

shell第四篇(上)

第四篇了解Shell 命令执行顺序分析 Shell 从标准输入或脚本中读取的每一行称为管道(pipeline);它包含了一个或多个命令(command),这些命令被一个或多个管道字符(|)隔开 事实上还有很多特殊符号可用来分隔单个的命令:分号(;).管道(|).&.逻辑AND (&&),还有逻辑OR (||).对于每一个读取的管道,Shell都回将命令分割,为管道设置I/O,并且对每一个命令依次执行下面的操作: 整个步骤顺序如上图所示,看起来有些复杂. 当命令行被处理时,每一个步骤

Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

<<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识.包含SWT控件的使用.界面布局.事件处理等内容:第二篇是插件开发核心技术,主要介绍插件开发的核心知识要点,包含行为(Action).视图(ViewPart).编辑器(Editor).透视图(Perspective)等10章的内容.第三篇主要讲述插件开发的高级内容,包含开发高级内容.富client平台技术(R

关于shell脚本基础编程第四篇

shell脚本基础编程第四篇本章主要内容:函数 函数 function:             function 名称 { 命令 ; } 或 name () { 命令 ; }           定义 shell 函数.               创建一个以 NAME 为名的 shell 函数.当作为一个简单的命令启用时,           NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令.当 NAME           被启用时,参数作为 $1...$n 被传递

cocos2d-x 3.2 之 三消类游戏——万圣大作战 (第四篇)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 呼呼,第四篇咯, 本篇主要讲述 > 时间 > 分数 本篇结束后,整个三消游戏的基本步骤就搞定了 1. 添加时间 一般消除类游戏,要么关卡,要么限制时间,但是关卡的设计很麻烦,个体创作,没有那么多精力, 所以只能通过限制时间来使游戏有些可玩性,但这种可玩性极低啊

认识元数据和IL(中)&lt;第四篇&gt;

书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知,下面是时候来了解什么是元数据,什么是IL这个话题了,我们继续. 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注

Servlet 2.4 规范之第四篇:Servlet上下文

SRV.3.1    ServletContext接口说明 ServletContext接口定义了运行servlet的web应用中和servlet相关的视图信息.容器提供者负责提供ServletContext的一套具体实现.通过ServletContext对象,servlet能记录事件.获得资源引用,以及设置和保存当前context上其他servlet的一些属性信息. ServletContext以web应用的某一路径为根节点,例如,servlet上下文能写成http://www.mycorp.

深入理解javascript作用域系列第四篇——块作用域

× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的代码,比如块作用域.随着ES6的推广,块作用域也将用得越来越广泛.本文是深入理解javascript作用域系列第四篇——块作用域 let for (var i= 0; i<10; i++) { console.log(i); } 上面这段是很熟