[译者按]Andy Li这篇文章,是我看过的最好的,最透彻的关于SharePoint Workflow架构的文章。通过阅读他的文章,我才清楚的了解了SharePoint Workflow的运作机制,并且在遇到问题的时候,知道如何下手查找问题。因此翻译过来,希望对Workflow的开发人员有帮助。
第一篇请查看:http://blog.csdn.net/spfarm/article/details/42464329
这篇博客是由Andy Li贡献的,他是SharePoint开发人员支持组的处理疑难问题的工程师。原文地址。这个关于Workflow的系列,是他贡献给社区的,帮助大家更好的理解Workflow运行时的内部机制,以及如何和SharePoint交互。
这篇文章由SPFarmer翻译。
宿主服务(HostService): SPWinOeHostService
在SharePoint里,Workflow宿主服务,TheWorkflow Host service是SPWinOeHostService这个类. 它做以下部分:
- 初始化System.Workflow.Runtime.WorkflowRuntime 对象.
- 嵌入 runtime services 到workflow runtime:
*持久化服务( Persistence Service)
*订阅服务(Subscription Service)
* 提交工作服务(CommitWorkBatch service)
-通过Communication Services 类和workflow实例通信:
* SPWinOETaskService
* SPWinOEWSSService
* 你的自定义的数据交换服务(data exchange service)基于SPWorkflowExternalDataExchangeService
- 处理WorkflowRuntime 事件,比如 WorkflowStarted,WorkflowStopped 等.
Workflow实例(Instance)
SharePoint 使用 SPWorkflow 对象来呈现Workflowruntime底层的workflowinstance. 这个对象包含很多属性,例如workflowinstance ID (System.Workflow.Runtime.WorkflowInstance),相关联的SharePointWeb, List, ListItem,以及其他的相关的信息,比如 history list, task list等等。
运行时服务(RuntimeServices)
SPWinOePersistenceService
持久性(Durability)是WindowsWorkflow Foundation的一个关键的功能, 这个功能允许workflows在等待用户输入时,可以被从内存中卸载(unloaded),并被序列化(serialized)之后持久存储起来,比如存数到SQL数据库或者XML文件。而任何时候当接收到用户输入时,workflow runtime 引擎加载(load) workflow 状态的信息到内存里,继续执行workflow.
当Workflow运行时候,如果特定的条件发生,Workflowruntime会使用持久化服务,来持久化Workflow实例的状态信息。这些条件包括:
- 当 TransactionScopeActivity activities和CompensatableTransactionScopeActivity activities里的自动传输完成的时候.
- 当workflow 实例空闲(idle),并且WorkflowPersistenceService的 UnloadOnIdle 标志位被设置成true的时候。例如当你使用DelayActivity activity的时候。
- 当runtime 的宿主应用程序对workflow实例调用 System.Workflow.Runtime.WorkflowInstance.Unload orSystem.Workflow.Runtime.WorkflowInstance.TryUnload 的时候
- 当一个workflow 实例被终结后者完成的时候.
- 当使用 PersistOnCloseAttribute 属性的自定的activity 完成的时候
如果一个条件符合了,persistence service 会被添加到runtime engine, the runtime engine 调用persistence service提供的方法,来保存workflowinstance的状态信息. 类似的,当workflowruntime engine 需要加载之前被持久化的Workflow,他调用persistenceservice提供的方法,从之前存储的介质里,加载workflow状态信息。换句话说,workflowruntime engine 决定什么时候持久化应该发生,但是到等待persistenceservice 真正执行需要的持久化操作.
SharePoint 扩展了runtime Persistence Service, 被叫做 Dehyderation/Rehydration 进程. 这个服务由SPWinOePersistenceService 类定义,被 SPWinOeHostService嵌入到Workflow runtime里.
SPWinOePersistenceService 的主要功能是持久化workflow实例到SharePoint内容数据库以及从内容数据库加载workflow. Workflow runtime 自动决定 PersistencePoint 然后调用persistence service 来卸载workflow实例。
下面的截图显示查询SharePoint内容数据库时候的结果. InstanceData 就是Workflow实例被序列化之后的数据,InstanceDataSize 是workflow 实例的大小。
select top 1 Id, InstanceData, InstanceDataSize from Workflow
SPWinOESubscriptionService
SPWinOESubscriptionService 继承自 WorkflowSubscriptionService. 开发人员可以使用订阅服务(subscriptionservice)来订阅workflow事件并且处理自定义逻辑,例如你在你的workflow里有一个OnTaskChangedactivity,当workflowruntime运行这activity时候,会调用 SPWinOESubscriptionService.CreateSubscription() 方法.运行时调用订阅服务来发送这个提醒,提醒有一个时间发生了,然后看是否需要做一些操作。
之前我们提到每个workflow task 都关联了一个event receiver ,我没有解释eventreceiver 是怎么来的,下面是答案:
SPWinOESubscriptionService 的目的是注册一个eventreceiver到每一个workflowtask上. Eventreceiver 负责处理Taskitem的 ItemUpdated 事件,把这个时间转化成一个workflowevent,并且传递给workflowruntime. 当event到达workflowinstance时,OnTaskChanged activity 被调用了. 等OnTaskChanged activity运行完毕之后,workflow runtime 调用SPWinOESubscriptionService.DeleteSubscription() 来从这个task上删除eventreceiver。
下面的表格列出了所有被SPWinOESubscriptionService处理的events:
Service |
Event |
ITaskService |
OnTaskCreated; |
ISharePointService |
OnWorkflowItemChanged; |
IListItemService |
OnItemCreated; |
让我们来举个例子,如果在你的workflow代码里,有两个activities,比如OnTaskChanged activity和OnTaskDeleted activity, SPWinOESubscriptionService 就会注册两个独立的eventreceivers 到这个task上,分别处理这个item的 ItemUpdated 和ItemDeleted events。
DefaultWorkflowCommitWorkBatchService
SharePoint 重用了WorkflowFoundation的 DefaultWorkflowCommitWorkBatchService. 这个service的作用是允许在提交workflow作业的时候(也被叫做持久化点),可以执行自定义逻辑. 当提交一个workflow作业的时候,workflow runtime调用这个service,并且给他一个真实执行提交作业的代理。在SharePoint,所有对task做的更新,都使用这个service. 例如,CreateTask activity用来创建一个task,但是这个taskitem并不是在这个activity完毕之后,马上就被提交。这个activity仅仅是准备这个新task的属性,然后他发动WorkBatch service提交taskitem到数据库的代理. 这个也解释了,如果你尝试在CreateTask activity之后,马上在CodeActivity 里面使用task item的实例,你会得到taskitem不存在的错误。
通信服务(CommunicationServices)
SharePoint 提供了一些开箱即用的communicationservice. 下面的表格解释了SharePoint里面使用的Service接口和类:
Service Interface |
Service Class |
ITaskService |
SPWinOeTaskService实现了 ITaskService, 被用来处理task相关的 activities, 比如创建,删除task. 他同时响应task相关的事件,比如 task created, task updated. |
IListItemService |
SPWinOeWSSService 实现了IListItemService 和ISharePointService. 他为workflow runtime提供处理item相关的操作的能力,并且响应这些事件。他还实现了ISharePointService, 可以用来发送邮寄,在History list里面打log等等。 |
IWorkflowModificationService |
SPWinOeWSSService 也实现了 IWorkflowModificationService 接口,来实现处理workflow修改。 |
SPWorkflowManager
SPWorkflowManager是唯一的开发人员能和SharePointworkflow runtime交互的对象。这个对象最主要的功能包含:
1. 允许开发人员在自定义的应用程序里启动SharePointworkflow.
2. 和SharePoint workflow runtime (SPWinOeHostService) 交互,传送外部事件给workflow
在以后的博客里,我们会详细的讨论WorkflowEvent处理管道。.
·
SharePoint Workflow架构(一)宿主服务(HostService): SPWinOeHostService