zoukankan      html  css  js  c++  java
  • WF4 持久化 <第四篇>

    一、基础示例

      WF4 默认支持SQLServer的持续化,首先要执行目录C:WindowsMicrosoft.NETFrameworkv4.0.30319SQLen下的脚本:

    • 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() 持久化命令,需要时供提供程序操作

    三、持久化的方式

      有两种方式可以执行持久化。

      1、Unload();卸载,这样WF4会帮助我们持久化一次。

      2、Persist();仅仅执行持久化操作。

    instance.Persist();
    
    instance.Unload();

      3、persist Activity的方式持久化

      往视图里添加一个persist控件,当流程执行到此步骤就会持久化,不管实例处于何种状态。实际上这也是调用一下instance.Persist();

      

      流程中最好不要带入一些不相关的变量或参数,因为SQLServer自带的持久化是要把这些数据序列化为二进制数据。如果不能序列化(没有加一个Dxxxx什么的标记的对象),则持续化不会生效。

  • 相关阅读:
    GoLang设计模式04
    GoLang设计模式03
    GoLang设计模式02
    GoLang设计模式01
    封装python代码,避免被轻易反编译
    openEuler 欧拉安装图形界面
    Deepin
    Debian安装PostgreSQL
    在 Linux 上使用 VirtualBox 的命令行管理界面
    Debian无法通过ssh连接
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3993405.html
Copyright © 2011-2022 走看看