您的位置:首页 > 运维架构 > 网站架构

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

2015-01-07 09:43 447 查看
[译者按]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;

OnTaskDeleted;

OnTaskChanged;

ISharePointService

OnWorkflowItemChanged;

OnWorkflowItemDeleted;

IListItemService

OnItemCreated;

OnItemChanged;

OnItemDeleted;

OnItemCheckedIn;

OnItemCheckedOut;

OnItemUncheckedOut;

OnItemAttachmentAdded;

OnItemAttachmentDeleted;

OnItemFileMoved;

让我们来举个例子,如果在你的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

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处理管道。.

·
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐