运行时服务包括:
(1)
计划服务(管理工作流的工作方式):DefaultWorkflowSchedulerService、ManualWorkflowSchedulerService。
批处理服务:DefaultWorkflowCommitWorkBatchService,SharedConnectionWorkflowCommitWorkService。
持久化服务(将工作流实例存储在硬盘上):SqlWorkflowPresistenceService。
跟踪服务:SqlTrackingService,SqlTrackingQuery。
(2)
事务处理、持久化服务、跟踪服务、Threading、通信服务、Timer
(3)Windows Workflow Foundation 服务
Windows 工作流计划服务
Windows 工作流计划服务管理工作流运行时引擎计划工作流实例的方式。无论这些服务是通过 DefaultWorkflowSchedulerService 以异步方式处理的,还是通过 ManualWorkflowSchedulerService 以手动、同步的方式处理的,它们都是工作流解决方案的重要 部分。
Windows 工作流 CommitWorkBatch 服务
Windows 工作流 CommitWorkBatch 服务的用途是启用与提交工作批次相关的自定义逻辑(又称作持久性点)。当提交工作批次时,运行时将对当前 CommitWorkBatch 服务进行调用并传递委托,该委托可以对工作批次执行实际提交。运行时仍必须执行提交,但是它允许服务将自身插入到进程中,从而支持针对提交进程进行一些自定义。
使用 DefaultWorkflowCommitWorkBatchService
使用 SharedConnectionWorkflowCommitWorkBatchService
Windows 工作流持久性服务
许多业务流程都需要花很长时间才能完成(长达数月或甚至数年)。将工作流保存在内存中不仅不切实际(由于内存限制的原因),而且,因为必须在单一服务器上处理实例,所以还会妨碍缩放。许多这些长期运行的工作流都是执行不活跃的流程或过程逻辑,并且实际上处于空闲状态,等待来自用户或其他系统的输入。通过卸载空闲的实例,主机应用程序将能够节省内存,并且能够跨处理服务器进行缩放。
Windows 工作流跟踪服务
使用 Windows Workflow Foundation 可以以一致、可靠而灵活的方式跟踪与工作流相关的信息。Windows Workflow Foundation 跟踪框架旨在使宿主通过捕获工作流执行期间引发的事件,而在执行期间可以观察到工作流实例。此框架为可插入式设计,使宿主可以编写自己的跟踪服务,也可以使用现成可用的或第三方跟踪服务。此外,由于使用 Windows Workflow Foundation 运行时引擎可以在其生存期过程中添加多个运行时服务,因此可以同时启用多个不同类型的跟踪服务。例如,Windows Workflow Foundation 包含一个现成可用的 SqlTrackingService 服务,此服务将数量可配置的跟踪信息写入 SQL Server 数据库。Windows Workflow Foundation 示例还包含一个示例 ConsoleTrackingService Sample,用于侦听事件和这些事件向控制台输出的内容。可以将这两个服务一起运行,以使最终用户可以查看工作流执行,并在开发过程中生成调试信息。
Windows 工作流持久性服务------------>
一、创建 SQL 持久性数据库
(1)CREATE DATABASE WorkflowPersistenceStore
(2)
C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN
(3)
SqlPersistence_Schema(SQL 持久性服务表)
SqlPersistence_Logic(SQL 持久性服务存储过程)
二、修改 SqlWorkflowPersistenceService 的 App.config
app.config->Services->
<add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="Initial Catalog=WorkflowPersistenceStore;Data Source=localhost;Integrated Security=SSPI;" LoadIntervalSeconds="5"/>
三、创建额外的工作流事件处理程序
void InitializeWorkflow(){
workflowRuntime = new WorkflowRuntime();
string constr = "Initial Catalog=WorkflowPersistenceStore;Data Source=.;Integrated Security=SSPI;";
Guid inId = new Guid("EE358EC3-5C7E-4DA5-A18F-40611044EA24");
SqlWorkflowPersistenceService pservice = new SqlWorkflowPersistenceService(constr,true,TimeSpan.MaxValue,new TimeSpan(0,0,10));
workflowRuntime.AddService(pservice);
ExternalDataExchangeService dataservice = new ExternalDataExchangeService();
workflowRuntime.AddService(dataservice);
localservice = new LocalService();
dataservice.AddService(localservice);
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();
};
instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
workflowRuntime.StartRuntime();
bool isExsit = false;
foreach (SqlPersistenceWorkflowInstanceDescription sd in pservice.GetAllWorkflows())
{
if (sd.WorkflowInstanceId == inId) {
isExsit = true;
break;
}
}
if (!isExsit)
{
instance.Start();
}
else {
instance = workflowRuntime.GetWorkflow(inId);
instance.Load();
Console.WriteLine((new StateMachineWorkflowInstance(workflowRuntime, instance.InstanceId)).CurrentStateName);
}
}