首页 > 代码库 > 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和创建了这个taskworkflow中交换任务信息.  ITaskService.CreateTask workflow实例用来在task列表里面创建task item.  ITaskService.OnTaskChanged 事件被SharePoint (宿主进程)用来发动 “event”workflow 实例.

需要一个实现了这些接口的服务类来实际完成这些数据交换。比如Microsoft.SharePoint.Workflow.SPWinOeTaskServices 实现了ITaskService 接口。这个服务类实际上实现了在SharePoint列表里创建task并且同时在事件被传动给宿主进程时候处理事件。

最后的一件事情是,挂这个数据交换服务到你的workflow上,这个是 HandleExternalEventActivity CallExternalMethodActivity如何参与到这个事情中的。在SharePointCreateTask 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 referencelifetime支配的。

下面的截图显示了在Visual StudioCreateTask Activity的属性。注意我们绑定了TaskId属性到了这个类的Task1_TaskId1这个属性。在方法Invoking (createTask1_Invoking())中,我们用一个新的GUID初始化了TaskId

 

不要混淆 correlation parameter“CorrelationToken”. 在上面的截图中注意到CorrelationToken的值是 “taskToken”. 并且同一个workflow OnTaskChanged activity(没有显示在这里)使用了同样的 correlation token.  这意味着他们是同一个的会话。

一旦 “taskId” CreateTask 或者 CreateTaskWithContentType activity初始化,他就会被后来有同样的correlationTokentask activity共享。这样他们就知道是哪个task的事件。然后当到达监听ITaskService.OnTaskChanged 事件的OnTaskChanged activity,它在workflow runtime上注册了一个事件然后,当 workflow runtime从宿主进程(SharePoint进程, w3wp or owstimer)接受 OnTaskChanged 事件时,她检查EventArgs taskId的值,然后,转发事件到有同样的TaskId correlationOnTaskChanged activity


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