[译者按]Andy Li这篇文章,是我看过的最好的,最透彻的关于SharePoint Workflow架构的文章。通过阅读他的文章,我才清楚的了解了SharePoint Workflow的运作机制,并且在遇到问题的时候,知道如何下手查找问题。因此翻译过来,希望对Workflow的开发人员有帮助。
这篇博客是由Andy Li贡献的,他是SharePoint开发人员支持组的处理疑难问题的工程师。原文地址。这个关于Workflow的系列,是他贡献给社区的,帮助大家更好的理解Workflow运行时的内部机制,以及如何和SharePoint交互。
这篇文章由SPFarmer翻译。
SharePoint 和Workflow Runtime的结合
下面的图表描述了SharePoint Workflow的几个大块的组成部分。首先我来概要的解释一下数据流,然后在后面的几个章节,我会详细的介绍每一个部分。
首先想一下你是如何启动一个workflow的。
这个部分说的是上面图表中,左边部分蓝色箭头指向的模块。
1. 首先你在List或者Library的workflow页面,点击关联到这个list或者library的workflow。然后你被重定向到workflow初始表单(Initiation
Form,如果你这个workflow有初始表单的话)。
2. 提交完初始表单之后( Initiation Form),消息被发到了SPWorkflowManager 。SPWorkflowManager 是在SharePointObject
Model里,你唯一可以用来启动一个workflow示例的对象。
3. SPWorkflowManager 然后通知SharePoint workflow runtimeobject (SPWinOeHostService)需要启动一个workflow实例.
4. SPWinOeHostService 的功能是通知Windows Workflow Runtime来真正启动workflow实例. 这个是通过先调用System.Workflow.WorkflowRuntime.CreateWorkflow() ,然后再调用System.Workflow.WorkflowInstance.Start().来实现的。
另外一个很常见的场景就是提交一个workflow task。
很多人很难理解task的数据是如何被传达到workflow实例的。这个实际上是SharePointWorkflow最复杂的地方,因为这个涉及到Workflowruntime和SharePoint的很多模块。我先概括的解释数据流,然后在后面的几篇blog里解释细节。
1. 这个流程从你打开一个workflow task的表单时开始。
2. 如果你有一个自定义的task表单,通常你会调用SPWorkflowTask.AlterTask() 来提交对这个task做的改动。这个API再调用SPListItem.Update() 来提交改动.如果你没有自定义的task表单,那么OOBSharePoint
task 在本质上做的是同样的事情.
3. 把数据从task传给worokflow的机制,是通过eventreceivers.实现的,你可能已经想到了。是的,这个就是task数据如何被传递给workflow的. 我会解释event
receivers 是如何被注册到tasks上的.现在你是需要知道,每一个workflowtask都有一个eventreceiver被hook在上面。目的是把task的改变,传给对应的workflow实例。
4. Event receiver 调用SPWorkflowManager (是的,它是唯一能够调用workflowruntime的object)的private方法SPWorkflowManager.RunWorkflow(). 也就是说,作为一个开发人员,你只能调用SPWorkflowTask.AlterTask() 或者 SPListItem.Update() 来出发这个动作。
注意: SharePoint 2010引入了一个新的概念叫PluggableService,来实现workflow能够和任何外部服务交互,比如自定义WCFservice,等等.在SharePoint2007里,这个是不可能的,在SharePoint2007里,只能通过SharePointTask俩和workflow通信.在图表里,SPWorkflowExternalDataExchangeService 被用来传递自定义事件给workflow.本质上,这个和传递task的改动到workflow是一样的,因此这里我们使用自带的task来解释其他事情。
5. 然后SPWorkflowManager 把数据传递给SharePointworkflow
runtime,然后要找出这个数据应该往下传给谁。例如,这是一个task,还是一个正常的item.基于数据的类型,对应的dataexchange
service 会继续传递数据。
6. 所有的data exchange services即使基于 Workflow
Communication Services.在SharePoint里面,Microsoft.SharePoint.Workflow.ITaskService 是在workflow和SharePoint之间交换数据的接口。后面我们会讨论更多。