1.2.3 Widows Workflow Runtime
在Windows Workflow中,活动可以视作提交给工作流处理器执行的指令或代码,而这个工作流处理器就是WF Runtime.为了启动工作流,我们必须托管Runtime与工作流服务.
1.2.3.1 托管Windows Workflow Runtime
Windows Worklow不是单独的应用程序,它和ASP.NET类似,WF生存在程序集中(比如System.Workflow.Runtime.dll). WF需要一个用以载入,初始化并启动工作流的Runtime宿主进程.和ASP.NET不同的是WF的宿主并不是唯一的,我们可以将WF托管在智能客户端应用程序,控制台应用程序或者Windows服务的进程中.
下图显示了我们在WF中执行工作流使用的主要的类.
要想使工作流执行环境运作起来只需创建一个WorkflowRuntime类的实例并调用StartRuntime方法即可.WorkflowRuntime定义了允许定制执行环境的方法和可以在执行期间监听的事件.当工作流完成了执行,中断或者空闲时Runtime便会触发事件.
只要创建了Runtime的实例,我们就可以使用CreateWorkflow方法创建工作流,CreateWorkflow方法返回一个WorkflowInstance对象,WorkflowInstance类用来表示一个工作流.工作流实例的Start方法将开始工作流的执行.如果发生了异常,工作流便调用Terminate方法(会导致Runtime抛出WorkflowTerminated事件),调用顺序如下图所示.
综上所述,WorkflowRuntime和WorkflowInstance类是工作流运行时最重要的两个类,除了这两个必需的类之外,还有其它内置在WF程序集中的类也在为WF Runtime提供许多重要的服务.
1.2.3.2 Runtime 服务
WorkflowRuntime类仅仅提供了执行工作流的基本功能,之前我们提到的一些重要功能(比如跟踪工作流)则可以通过WorkflowRuntime提供的扩展性机制-AddService方法来实现.
AddService允许我们向Runtime中添加可用的服务.这些服务可以是我们为特定领域编写的自定义服务,也可以是WF中内置的服务.
让我们从这些内置的服务开始,继续漫游工作流.
1.2.3.2.1 调度服务 Scheduling Services
调度服务用来控制Runtime执行工作流所需要的线程.
DefaultWorkflowSchedulerService会创建新的线程来执行工作流.因为工作流和宿主应用程序的线程是分开的,所以工作流是异步执行的并且不会阻止任何应用程序的线程.我们还可以配置允许同时执行的工作流最大数量.
当宿主应用程序可以转让线程给工作流Runtime时可以使用另外一个调度服务-ManualWorkflowSchedulerService.对服务器端应用程序(比如ASP.NET Web应用程序和Web Service)而言,把线程转让给Runtime非常有用.服务器端应用程序通常的做法是为每个客户端请求的服务创建线程.而宿主应用程序把线程”借给”WF Runtime的意义在于可以让Runtime在每个请求的线程上同步地执行工作流,而不是为每个请求创建两个线程.
和Windows Worklow的所有服务一样,如果内置的服务不能满足你的需求,你可以定义你自己的调度服务.
1.2.3.2.2 事务服务 Transaction Services
事务服务允许Runtime保持位于工作流内部和持久存储器(durable store)中的状态的一致性.默认的事务服务是DefaultWorkflowTransactionService类的实例.正在运行的工作流进程中的活动和此服务共享相同的进程和相同的事务上下文.
WF依靠.NET中的System.Transactions名称空间来实现事务机制. Transactions类提供一个轻量级的, auto-enlisting并且可提升的事务.事务像本地事务一样启动,然后Runtime可以根据需要把它提升为重量级的分布式事务.
1.2.3.2.3 持久化服务 Persistence Services
持久化服务负责把工作流状态保存到持久储存器.SqlWorkflowPersistenceService会把工作流状态保存到SQL Server数据库.长时间运行的工作流需要持久化服务,因为我们不能让处理订货单的工作流在内存里驻留30天直到客户支付才从内存中卸载.相反,Runtime应该保持工作流的状态到持久存储器中,并且把工作流实例从内存中卸载.在这30天中,Runtime可以重新加载工作流实例并恢复运行.当持久化服务启用时,WF Runtime会自动保持工作流空闲或者暂停等状态.
SqlWorkflowPersistenceService支持SQL Server 2000以及更高版本(还包括免费的MSDE和Express版).当然,我们还需要一个数据库架构来让持久化服务知道如何去保存工作流状态,这部分内容将在后面的章节详述.
1.2.3.2.4 跟踪服务 Tracking Services
当调度服务选择了工作流运行的线程之后,跟踪服务就会负责监视并记录工作流的执行信息.跟踪服务使用Tracking Profile来通知Runtime它需要的工作流信息的类型.跟踪服务还可以打开跟踪频道(Tracking Channel)来接收事件和数据.这部分内容将在后面的章节详述.
WF包含一个SqlTrackingService类,这个类可以将跟踪数据存储到SQL Server数据库.跟踪服务将使用之前介绍过的事务服务来确保工作流的跟踪数据与被跟踪工作流的状态一致.默认Runtime不会启动跟踪服务,但我们可以用编程的方式添加跟踪服务(或使用应用程序配置文件配置跟踪服务).