天天看点

Workflow笔记3——BookMark和持久化

我们在平时的工作流使用中,并不是直接这样一气呵成将整个工作流直接走完的,通常一个流程到了某一个节点,该流程节点的操作人,可能并不会马上去处理该流程,而只有当处理人处理了该流程,流程才会继续往下走。对于不同流程节点的处理人,他所能处理的是不同的流程节点。

怎么让流程停下来,等待其他用户对流程进行参与处理。并且必须能够保证流程能够在原有的处理现场情况进行保存,而且能够对流程进行继续启动和处理?那就是书签。

就好像我们看书,我们需要书签来标识,我现在已经看到哪个地方了,工作流也是一样的,我需要通过书签,来确定不同角色的人能处理的是哪一个流程。

要定义具备Bookmark的Activit,可从 NativeActivity继承,override [Execute 方法],使用[NativeActivityContext.CreateBookmark方法]添加Bookmark,需要override [ CanInduceIdle 属性],使其返回值为[True]。

1、在项目WindowsWorkFlowApp中,新建“代码活动” BookMarkCodeActivity

修改继承类为NativeActivity,Execute方法的参数类型变为NativeActivityContext类型了。代码如下:

Workflow笔记3——BookMark和持久化
Workflow笔记3——BookMark和持久化

2、生成项目WindowsWorkFlowApp

3、双击State1打开,将代码活动添加到State1中,并创建变量Vnum。

Workflow笔记3——BookMark和持久化

4、创建输入参数InputBookMarkName

Workflow笔记3——BookMark和持久化

5、改造Form1窗体

Workflow笔记3——BookMark和持久化

修改启动工作流的代码:

将以WorkflowApplication app;提取到类下面。

Workflow笔记3——BookMark和持久化
Workflow笔记3——BookMark和持久化

为“继续执行”按钮添加代码

Workflow笔记3——BookMark和持久化
Workflow笔记3——BookMark和持久化

6、双击T1进行修改,添加条件判断

Workflow笔记3——BookMark和持久化

假设VNum变量的值等于5,则继续往下执行State2。

7、添加T3,当VNum变量的值不等于5,再回到State1。

Workflow笔记3——BookMark和持久化

双击T3,添加条件

Workflow笔记3——BookMark和持久化

8、运行结果如下:

Workflow笔记3——BookMark和持久化

持久化:工作流持久性是指独立于进程或计算机信息持续捕获工作流实例的状态。持久存储化,例如用磁盘进行存储,光盘存储等持久化的存储数据就是持久化。

为何持久化?财务审批中,提交了审批邀请后,财务总监过了一周才进行审批。那么数据必须进行持久化的保存,等待流程的继续相关处理。

工作流在长时间运行时难免会遇到一些问题,许多业务逻辑需要花费数日、数周乃至数月。在这段时间中,我们不能让工作流实例一直驻留在内存中。

当 TransactionScope 活动完成时或 TransactedReceiveScope 活动完成时。

当工作流实例变为空闲状态,且对工作流主机设置了 WorkflowIdleBehavior 时。 例如,当使用消息传递活动或 Delay 活动时会发生此情况。

当 WorkflowApplication 变为空闲状态且将应用程序的 PersistableIdle 属性设置为 PersistableIdleAction.Persist 时。

当指示主机应用程序持久化或卸载工作流实例时。

当终止工作流实例或工作流实例结束时。

当执行 Persist 活动时。

当使用 Windows Workflow Foundation 的早期版本开发的工作流实例在可互操作执行过程中遇到持久点时。

1、通过创建一个数据库来持久保存工作流实例。新建数据库WorkFlowDB:

Workflow笔记3——BookMark和持久化
Workflow笔记3——BookMark和持久化

2、然后新建表来存储工作流的实例数据,如何新建表?

到%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN 文件夹下面去寻找脚本,按Win+R,运行%WINDIR%\Microsoft.NET\Framework

Workflow笔记3——BookMark和持久化
Workflow笔记3——BookMark和持久化

找到这两个SQL脚本之后,在数据库WorkFlowDB中首先运行 SqlWorkflowInstanceStoreSchema.sql 文件,然后运行 SqlWorkflowInstanceStoreLogic.sql 文件。执行完成之后,就会在数据库WorkFlowDB中新建如下表。

Workflow笔记3——BookMark和持久化

InstancesTable表就是用来存储工作流实例的表。

3、在项目WindowsWorkFlowApp中,添加如下两个程序集的引用

Workflow笔记3——BookMark和持久化

4、修改工作流启动代码

引入命名空间

修改btnStartWorkFlow_Click代码:

只需要这两行代码,就可以执行持久化工作。那么当下次重新打开工作流的时候,我需要从数据库中找到是那一条工作流实例数据,为了演示简单,我这里就将工作流实例的主键直接放到From窗体界面展示,而通常在工作中,我们是会用数据表来专门存储这些数据信息的。

5、改造Form1代码,修改btnContinue_Click

Workflow笔记3——BookMark和持久化

 View Code

Workflow笔记3——BookMark和持久化

6、我们看数据表中已经多了一条工作流实例数据

Workflow笔记3——BookMark和持久化

7、然后关闭应用程序,再重新启动

从数据库中找到这个ID,然后填写上。

Workflow笔记3——BookMark和持久化

我们看到整个工作流执行完成了,在来看数据表中的工作流实例数据已经删除了。

Workflow笔记3——BookMark和持久化

本文转自邹琼俊博客园博客,原文链接:http://www.cnblogs.com/jiekzou/p/6194003.html,如需转载请自行联系原作者