Workflow:添加工作流存储功能

数据库准备:

1. 创建database(这里我们用的是MSSQL。Workflow支持其它数据库,但是MSSQL是配置最方便,不要问我为什么!)。

2. 运行位于[%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN]的的脚本文件SqlWorkflowInstanceStoreSchema.sql和SqlWorkflowInstanceStoreLogic.sql。这时数据库中表应该类似于下图:

 

开工:

1. 在上一个项目的基础上,引入System.Activites.DurableInstancing和System.Runtime.DurableInstancing。如下图所示:

2. 修改Console Project的program.cs如下:

 1         static void Main(string[] args)
 2         {
 3             // Workflow Store of SQL Server
 4             SqlWorkflowInstanceStore store =
 5                 new SqlWorkflowInstanceStore("Data Source=192.168.3.26;Initial Catalog=workflow_hour3;Persist Security Info=True;User ID=sa;Password=M@nager");
 6 
 7             AutoResetEvent syncEvent = new AutoResetEvent(false);
 8 
 9             Activity wf = new WorkflowsProject.Activity1();
10 
11             // Create the WorkflowApplication using the desired
12             // workflow definition.
13             WorkflowApplication wfApp = new WorkflowApplication(wf);
14 
15             // Assign workflow store to the current workflow
16             wfApp.InstanceStore = store;
17 
18             wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
19             {
20                 Console.WriteLine("Workflow {0} persisted at {1}",
21                     e.InstanceId, System.DateTime.Now.ToLongTimeString());
22                 return PersistableIdleAction.Persist;
23             };
24 
25             wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e)
26             {
27                 Console.WriteLine("Workflow {0} idled at {1}",
28                     e.InstanceId, System.DateTime.Now.ToLongTimeString());
29                 syncEvent.Set();
30             };
31 
32             // Handle the desired lifecycle events.
33             wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
34             {
35                 Console.WriteLine("Workflow {0} completed.", e.InstanceId.ToString());
36                 syncEvent.Set();
37             };
38 
39             wfApp.Aborted = delegate(WorkflowApplicationAbortedEventArgs e)
40             {
41                 Console.WriteLine("Workflow {0} terminated because {1}", e.InstanceId, e.Reason.Message);
42                 syncEvent.Set();
43             };
44             
45             // Start the workflow.
46             wfApp.Run();
47 
48             // Wait for Completed to arrive and signal that
49             // the workflow is complete.
50             syncEvent.WaitOne();
51 
52             // Keep the console screen alive when workflow comnpletes
53             Console.WriteLine("Press enter to continue");
54             Console.Read();
55         }

3. 修改Delay的Duration为30秒,方便我们观察数据库的数据变化:

4. 运行。结果如下:

5. 在workflow persisted阶段,还没有到completed的时候,如果查看数据库中的[System.Activities.DurableInstancing].[InstancesTable]表,我们就会发现诸如如下的记录:

 

而当workflow运行到completed的时候,在查询这张表,就会发现这条记录已经不存在了。说明工作流的数据存储运行正确。

 

posted @ 2014-05-09 13:31  GreatK  阅读(759)  评论(0编辑  收藏  举报