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

SharePoint Workflow架构(二)Workflow 事件处理管道(Event Processing Pipeline)

2015-01-08 13:32 483 查看
[译者按]Andy Li这篇文章,是我看过的最好的,最透彻的关于SharePoint Workflow架构的文章。通过阅读他的文章,我才清楚的了解了SharePoint Workflow的运作机制,并且在遇到问题的时候,知道如何下手查找问题。因此翻译过来,希望对Workflow的开发人员有帮助。

这篇博客是由Andy Li贡献的,他是SharePoint开发人员支持组的处理疑难问题的工程师。原文地址。这个关于Workflow的系列,是他贡献给社区的,帮助大家更好的理解Workflow运行时的内部机制,以及如何和SharePoint交互。

这篇文章由SPFarmer翻译。

前两篇地址:

宿主服务(HostService): SPWinOeHostService

SharePoint 和Workflow Runtime的结合

Workflow 事件处理管道(Event Processing Pipeline)
几乎上所有的workflow都需要一些用户交互。比如,你的workflow可能需要创建一些task,并且分给一些用户来批准。当他们收到他们的task,他们会打开站点,提交他们的反馈,反馈会被送回workflow,然后继续执行。用户提交一个task之后,后台有很多的动作在进行。早些时候我们提到过,当用户提交一个task的时候,一个event
receiver会响应这个事件,并把task的变化传递给workflow。通常我们把这个过程叫做事件传递,在workflow
runtime里,这个叫数据交换。他们说的是一个意思。在这节里,我们会谈论在这个过程中所有的动作。
Workflow数据交换服务(Data Exchange Service)
Workflow宿主进程可以和通过自定义本地通信服务和workflow通信。这些本地通信服务实现了定义在workflow和宿主进程间通信的方法和事件的自定义接口。事件被用来发送数据到workflow。反之,workflow使用方法来发送数据到宿主进程。
下面的图标显示了本地通信服务如何和他的宿主进程通信的。你可以阅读Using LocalServices in Workflows 来获取更多的信息。




例如,SharePoint
定义了 ITaskService来处理在SharePoint和创建了这个task的workflow中交换任务信息. ITaskService.CreateTask 被workflow
实例用来在task列表里面创建task item. ITaskService.OnTaskChanged 事件被SharePoint
(宿主进程)用来发动 “event”
到workflow
实例.
需要一个实现了这些接口的服务类来实际完成这些数据交换。比如Microsoft.SharePoint.Workflow.SPWinOeTaskServices 实现了ITaskService 接口。这个服务类实际上实现了在SharePoint列表里创建task并且同时在事件被传动给宿主进程时候处理事件。
最后的一件事情是,挂这个数据交换服务到你的workflow上,这个是 HandleExternalEventActivity 和CallExternalMethodActivity
如何参与到这个事情中的。在SharePoint的CreateTask activity本质上是绑定到 ITaskService.CreateTask
上的CallExternalMethodActivity 。
ITaskService
用ILSpy看一下 ITaskService 的定义:




现在来解释一下correlation是如何工作的。简单的说,correlation参数被workflow
runtime用来为事件查找正确的传送目标。你可能还记得在SharePoint里,每一个task activity都需要TaskId参数(查看上面的截图)。注意。CreateTask有一个CorrelationInitialization方法,就是在这个方法里,创建一个新的TaskId,这个值被这个task的其他activity使用,比如, OnTaskChanged activity。
之后,当一个用户提交了这个task的更改,workflow runtime使用这个TaskId来查找 OnTaskChanged activity,这个就是事件应该被传递到的地方(记住可以有多个workflow
instances 可能会有多个 OnTaskChanged activities在系统里)。
Correlation 是如何运作的?
CorrelationParameterAttribute 为数据交换定义了标识符( identifier).接口上的每一个方法或者事件都被生命了一个参数,比如就像在 ITaskService interface
例子中显示的TaskId.
你也可以使用其他的属性来描述更加复杂的correlation
匹配.
任何一个开启了一个会话的操作,方法或者事件必须要有CorrelationInitializerAttribute属性,例如, ITaskService.CreateTask 和ITaskService.CreateTaskWithContentType 就是会话的开始。当调用有 CorrelationInitializerAttribute属性的方法时,服务类知道,伴随着这个调用一个新的会话开始了。
workflow 会话的lifetime is
是由correlation reference的lifetime支配的。
下面的截图显示了在Visual Studio中CreateTask Activity的属性。注意我们绑定了TaskId属性到了这个类的Task1_TaskId1这个属性。在方法Invoking (createTask1_Invoking())
中,我们用一个新的GUID初始化了TaskId。


不要混淆 correlation parameter
和“CorrelationToken”.
在上面的截图中注意到CorrelationToken
的值是 “taskToken”.
并且同一个workflow中 OnTaskChanged activity(没有显示在这里)使用了同样的
correlation token. 这意味着他们是同一个的会话。
一旦 “taskId”被 CreateTask 或者 CreateTaskWithContentType activity初始化,
他就会被后来有同样的correlationToken的task activity共享。这样他们就知道是哪个task的事件。然后当到达监听ITaskService.OnTaskChanged 事件的
OnTaskChanged activity时,
它在workflow runtime上注册了一个事件.
然后,当 workflow runtime从宿主进程(SharePoint
进程, w3wp or owstimer)接受 OnTaskChanged 事件时,
她检查EventArgs的 taskId
的值,然后,转发事件到有同样的TaskId correlation的OnTaskChanged activity。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐