Windows workflow foundation SqlTrackingService 详解(1)
—跟踪workflow 的状态
如果想使用wwf 进行开发,最重要的就是跟踪workflow和activity 的运行状态。
本文章分几个部分,详细的解释wwf 里面SqlTrackingService的情况。
概念解释: 3种跟踪类型
workflow Events – 跟踪 workflow instance 的状态。
例如: 'Initialized' 和'Executing'等
Activity Level Events – 跟踪Activity instance 的状态
User Tracked events – 跟踪用户自指定的Activity的状态
1. 建立Tracking数据库
下载Windows Workflow Foundation Hands-On Lab (RC版本的).
运行C:\Windows Workflow FoundationRC\Labs\SQL_Scripts\Lab03里面的CreateDatabaseObjects.cmd 文件.
如果运行成功将出现如下画面

注:需要的sql server2005或者 sql server2005\SQLEXPRESS,
笔者的修改 修改了Osql -S %COMPUTERNAME%\SQLEXPRESS -E -n -i "Create_TrackingStore.Sql"
变成了Osql -S %COMPUTERNAME% -E -n -i "Create_TrackingStore.Sql"
2. 建立Test工程
建立一个C#的“Sequential Workflow Console Application”.的工程

3. 把workflow1.cs的名称改为SimpleWorkflow.cs

4. 添加引用如下:
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Globalization;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Workflow.ComponentModel;
using System.Workflow.Activities;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Runtime.Tracking;
5. 拖一个codeAcivity到workflow,并改名为working

6. 给code Acivity加入代码
Private void working_ExecuteCode (object sender, EventArgs e)
{
Console.WriteLine("Here in working_ExecuteCode.");
}
7. 在Program.cs中加入static 变量
class Program
{
static string connectionString = "Initial Catalog=TrackingStore;Data Source=localhost; Integrated Security=SSPI;";
……
}
7. 修改Main函数如下:
static void Main(string[] args)
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
SqlTrackingService trackingServer = new SqlTrackingService(connectionString);
workflowRuntime.AddService(trackingServer);
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(DefaultSQLServices.Workflow99));
instance.Start();
instance.Suspend("Reason we are suspending the workflow.");
instance.Resume();
waitHandle.WaitOne();
// 取得Insance的运行情况
GetInstanceTrackingEvents(instance.InstanceId);
Console.WriteLine("Workflow Completed - press ENTER to continue");
Console.Read();
}
}
8. 完成函数GetInstanceTrackingEvents
static void GetInstanceTrackingEvents(Guid instanceId)
{
Console.WriteLine("\r\nInstance Tracking Events :");
SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString);
SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance;
sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance);
try
{
foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents)
{
Console.WriteLine("EventDescription : {0} DateTime : {1}",
workflowTrackingRecord.TrackingWorkflowEvent, workflowTrackingRecord.EventDateTime);
}
}
catch (Exception)
{
Console.WriteLine("No Instance Tracking Events Found");
}
}
8. GetInstanceTrackingEvents函数,主要使用SqlTrackingQuery类,取得WorkflowInstance的运行情况
9. 运行后显示情况如下:

10.涉及的表
|
表名称
|
用途
|
备注
|
|
TrackingProfile
|
存储Tracking 的配置,现在使用的是缺省配置,不需要设置.
|
|
|
vw_Workflow
|
Workflow的基本信息
|
|
|
vw_WorkflowInstance
|
已经或者正在运行的WorkflowInstance
|
|
|
vw_Activity
|
Activity的基本信息
|
|
|
vw_ActivityInstance
|
已经或者正在运行的ActivityInstance
|
|
11.总结:这是最简单的对workflow的跟踪,笔者将继续完成其他的部分。
参考资料
WinFx Windows workflow foundation Hands-On Lab 03
发表于 @ 2006年11月20日 16:35:00|评论(loading...)