WF运行时服务介绍
- 综述
WF运行时(WorkflowRuntime)是一个服务的容器,它依赖一组公共的核心服务来管理WF实例,但WF运行时设计得非常轻量级,它的许多功能都由宿主程序定义。WF为这些服务提供了现成的实现,不过宿主程序也可以自行开发以满足特定的需求,将服务加入到WF运行时中。
下面是WF提供的运行时服务的实现。所有服务都继承自基类WorkflowRuntimeService。对于必要的运行时服务,如果宿主程序没有选择其他实现,WF将加载默认的服务。非必要的运行时服务,如果宿主程序没有选择其他实现,WF将不加载任何实现。
服务名 |
默认加载 |
其他实现 |
必要 |
WorkflowLoaderService |
DefaultWorkflowLoaderService |
n/a |
是 |
WorkflowSchedulerService |
DefaultWorkflowSchedulerService |
ManualWorkflowSchedulerService |
是 |
WorkflowCommitWorkBatchService |
DefaultWorkflowCommitWorkBatchService |
SharedConnectionWorkflowCommitWorkBatchService |
是 |
WorkflowPersistenceService |
n/a |
SqlWorkflowPersistenceService |
否 |
TrackingService |
n/a |
SqlTrackingService |
否 |
ExternalDataExchangeService |
n/a |
n/a |
否 |
- 工作流加载器服务
工作流加载器服务(WorkflowLoaderService)负责为运行时创建活动的实例,具体工作是将输入解释成可执行的工作流定义。
WF默认加载DefaultWorkflowLoaderService,可以解析流程的XAML描述,并使用WorkflowMarkupSerializer将XAML反序列化成活动树。
宿主程序可以实现自定义的加载器服务,对其他格式的流程描述进行解释,比如实现对一个Viso文件中流程描述的解析,并转换成活动。
- 工作流计划服务
工作流计划服务(WorkflowSchedulerService)负责为运行时提供实际执行工作流的线程,以管理运行工作流实例的方式。
WF默认加载DefaultWorkflowSchedulerService ,它创建和管理在工作流运行时引擎上以异步方式运行工作流实例的线程。等待运行的工作流存储在 DefaultWorkflowSchedulerService 的内部队列中。当 DefaultWorkflowSchedulerService 要启动工作流时,从线程池中获取一个线程并使用此线程运行工作流。
WF还提供ManualWorkflowSchedulerService,可以以手动、同步的方式运行工作流实例。它提供了一个线程服务,宿主应用程序可在当前线程而不是新线程上运行工作流实例(即处于同步模式)。ManualWorkflowSchedulerService 不会自动运行队列中的工作流实例,宿主必须调用 RunWorkflow 来运行指定的工作流。当工作流执行时,将阻塞宿主应用程序的执行,当工作流处于空闲状态时才会返回。
- 工作流持久化服务
工作流持久化服务(WorkflowPersistenceService)负责将工作流实例持久化到存储介质,并从内存中移除,在之后可以重新载入内存恢复执行。
当工作流运行的时候发生特定情况时,如果加载了持久化服务,工作流运行时引擎就会使用持久性服务保留有关工作流实例的状态信息。这些情况包括:
1.当完成 TransactionScopeActivity 活动和 CompensatableTransactionScopeActivity 活动中的原子事务时。
2.当工作流实例空闲,且对 WorkflowPersistenceService 将 UnloadOnIdle 标志设置为 true 时。
3.当宿主应用程序对工作流实例调用 WorkflowInstance.Unload 或 WorkflowInstance.TryUnload 时。
4.当中止工作流实例或工作流实例结束时。
5.当使用[PersistOnClose]特性的自定义活动完成时。
WF默认不加载持久化服务,但提供SqlWorkflowPersistenceService的实现,由宿主选择。宿主程序也可以开发自定义的持久化服务,将工作流实例持久化到其他存储介质中,比如:文件、或者Orcale数据库。
- 跟踪服务
跟踪服务(TrackingService)负责收集和存储跟踪信息。它可以使宿主程序通过捕获工作流执行期间引发的事件,而在执行期间可以观察到工作流实例。
WF默认不加载跟踪服务,但提供SqlTrackingService的实现,由宿主选择。SqlTrackingService还还会在其数据库中保留跟踪配置文件,工作流运行时引擎知道对所使用的任何跟踪配置文件所做的更改。
另外在WF示例中还有两个服务可用,ConsoleTrackingService和SimpleFileTrackingService,这二个服务可以把跟踪信息写到控制台窗口或者文件中。
- 工作流批次提交服务
工作流批次提交服务(WorkflowCommitWorkBatchService)负责启用与工作批次提交相关的自定义逻辑,用来提供事务功能。
默认加载DefaultWorkflowCommitWorkBatchService,在调用CommitWorkBatch方法提交工作批次时,如果不存在事务,会创建一个分布式事务。如果在调用 CommitWorkBatchCallback 时引发异常,则服务可以捕获此异常,启动新事务并再次调用委托。但如果存在不属于服务的事务,重试就是无效的。
WF还实现了SharedConnectionWorkflowCommitWorkBatchService,它用于在不同对象之间使用共享连接的数据库事务。如果在工作流应用程序中同时加载了SqlTrackingService 和 SqlWorkflowPersistenceService并且使用同一个数据库,可以选择SharedConnectionWorkflowCommitWorkBatchService 服务代替默认的服务,为跟踪和持久性数据库使用一个共享连接,以此来避免使用分布式事务。
- 外部数据交换服务
外部数据交换服务(ExternalDataExchangeService),负责工作流与外部对象的通信。
服务的接口需要声明[ExternalDataExchange]特性,服务中定义的方法供CallExternalMethodActivity从外部接收信息,定义的事件(继承自ExternalDataEventArgs)用于触发HandleExternalEventActivity。
- 加载服务代码
以下是通过配置文件加载WF运行时服务的代码示例,除了LoaderService之外,都为运行时加载了非默认的服务。
WorkflowRuntime
1 //工作流运行时
2 WorkflowRuntime workflowRuntime = new WorkflowRuntime("WorkflowRuntime");
3
4 //外部服务
5 ExternalDataExchangeService exchangeService = new ExternalDataExchangeService("LocalServices");
6 workflowRuntime.AddService(exchangeService);
2 WorkflowRuntime workflowRuntime = new WorkflowRuntime("WorkflowRuntime");
3
4 //外部服务
5 ExternalDataExchangeService exchangeService = new ExternalDataExchangeService("LocalServices");
6 workflowRuntime.AddService(exchangeService);
配置文件:
config文件
1 <configSections>
2 <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
3 <section name="LocalServices" type="System.Workflow.Activities.ExternalDataExchangeServiceSection, System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
4 </configSections>
5
6 <WorkflowRuntime>
7 <CommonParameters>
8 <add name="ConnectionString" value="Data Source=;Initial Catalog=;user id=; password= "/>
9 </CommonParameters>
10 <Services>
11 <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true"/>
12 <add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
13 <add type="System.Workflow.Runtime.Hosting.SharedConnectionWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
14 <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
15 </Services>
16 </WorkflowRuntime>
17
18 <LocalServices>
19 <Services>
20 <add type="Wuhong.WFTest.MyLocalService, Wuhong.WFTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
21 </Services>
22 </LocalServices>
2 <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
3 <section name="LocalServices" type="System.Workflow.Activities.ExternalDataExchangeServiceSection, System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
4 </configSections>
5
6 <WorkflowRuntime>
7 <CommonParameters>
8 <add name="ConnectionString" value="Data Source=;Initial Catalog=;user id=; password= "/>
9 </CommonParameters>
10 <Services>
11 <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true"/>
12 <add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
13 <add type="System.Workflow.Runtime.Hosting.SharedConnectionWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
14 <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
15 </Services>
16 </WorkflowRuntime>
17
18 <LocalServices>
19 <Services>
20 <add type="Wuhong.WFTest.MyLocalService, Wuhong.WFTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
21 </Services>
22 </LocalServices>