首页 > 代码库 > SharePoint Workflow架构(二)Workflow 事件处理管道(Event Processing Pipeline)
SharePoint Workflow架构(二)Workflow 事件处理管道(Event Processing Pipeline)
[译者按]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。
SharePoint Workflow架构(二)Workflow 事件处理管道(Event Processing Pipeline)