[译者按]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 Runtime如何与SharePoint交互、事件处理管道(Event Processing Pipeline)的工作流程、数据交换服务(Data Exchange Service)的作用及其实现机制等关键内容。
4123

被折叠的 条评论
为什么被折叠?



