SharePoint Workflow架构(一)宿主服务(HostService): SPWinOeHostService

[译者按]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 serviceSPWinOeHostService这个类它做以下部分:

- 初始化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 activitiesCompensatableTransactionScopeActivity 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
SharePoint Workflow架构(一)宿主服务(HostService): SPWinOeHostService

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; 
OnTaskDeleted; 
OnTaskChanged;

ISharePointService

OnWorkflowItemChanged; 
OnWorkflowItemDeleted;

IListItemService

OnItemCreated; 
OnItemChanged; 
OnItemDeleted; 
OnItemCheckedIn; 
OnItemCheckedOut; 
OnItemUncheckedOut; 
OnItemAttachmentAdded; 
OnItemAttachmentDeleted; 
OnItemFileMoved;

让我们来举个例子,如果在你的workflow代码里,有两个activities,比如OnTaskChanged activityOnTaskDeleted 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 
ISharePointService

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

上一篇:windowmanger的addview,removeView方法出现的异常


下一篇:【百度地图API】除夕夜,大家一起来赶走“夕”——删除标注功能