SharePoint对于Workflow的历史信息清理的要点
禁用workflow history的自动清除作业
=========================
Workflow是由一些列的事件组成的, 诸如workflow initiation, task creation, 和task completion. 当你添加一个workflow的时候, 一个workflow history数据库就被自动得创建出来, 用来跟踪workflow的事件. workflow history数据库存储包括日期, 状态, 参与者, 和描述等每个事件的关键信息. workflow history记录项存放在Sharepoint列表中, 这个列表与列表或者文档库是关联起来的, 目的是查看workflow的状态和报告错误.
Microsoft Office SharePoint Server 2007每天都运行一个Workflow auto Cleanup的作业, 它会从Workflow history列表中移出掉已完成或者已取消60天的记录项. [译者注]: 被划掉的这段话有错误. 实际的情况是workflow列表中的记录项并没有被删除, 删除的只是文档与workflow history列表中列表项的关联关系, 其目的是清除掉workflow的实例以及任务列表. 如果你想要跟踪更长时间段内的workflow信息, 你可以禁用掉这个Workflow Auto Cleanup作业.
然而, 就像任何的SharePoint列表一样, 如果你的workflow history列表超过了2000个项目, 你站点的性能就会受到影响. 如果你关心workflow history列表的尺寸, 你可以重新开启Workflow Auto Cleanup作业. 另一个选择, 你可以为每一个workflow关联都创建一个单独的workflow history列表.
更多信息请参考Add a workflow to a list or document library.
注意: Workflow history的目的并不是用来监视workflow事件的, 并且它也不够安全. Office SharePoint Server 2007维护一个关于Workflow事件的日志, 但是并不会提供一个预定义的监视报告. 你可以使用SPAuditEntry类来写一个自定义的监视日志(audit log)
禁用自动清除workflow的步骤
-
From Central Administration, click the Operations tab on the top navigation bar.
-
On the Operations page, in the Global Configuration section, click Timer job definitions.
-
On the Timer Job Definitions page, click Workflow Auto Cleanup to edit the appropriate timer job.
-
On the Edit Timer Job page, click Disable and then click OK to disable the Workflow Auto Cleanup feature.
如何修改自动清除60天这个期限呢?
=========================
默认情况下SPWorkflowAssociation.AutoCleanupDays这个属性的值是"60"天, 要修改这个值, 你需要调用SPList.UpdateWorkflowAssociation(SPWorkflowAssociation)函数, 在这里SPWeb.Update()方法行不通.
1: SPSite site = new SPSite("<http://nishandv3:100/sites/DevSite/>");
2: SPWeb web = site.OpenWeb();
3: SPWorkflowTemplateCollection collection = web.WorkflowTemplates;
4: SPList list = web.Lists["Shared Documents"];
5: SPWorkflowAssociation _asso = null;
6: foreach (SPWorkflowAssociation asso in list.WorkflowAssociations)
7: {
8: if (asso.Name == "Approval")
9: {
10: asso.AutoCleanupDays = 100;
11: _asso = asso;
12: }
13: }
14: List.UpdateWorkflowAssociation(_asso);
上面这种代码的方式修改的是站点级的. 下面通过stsadm.exe的方式做的修改时web application级的.
stsadm -o setproperty -propertyname job-workflow-autoclean -propertyvalue "yearly at Jan 1 15:00:00" -url <Http://server>
更多信息可以参考
http://technet.microsoft.com/en-us/library/cc424956.aspx
对于查看丢失了的Workflow History信息的替代方法
==========================
如上所述, 在workflow history列表中, 默认你是看不到六十天前完成的workflow的. 关于workflow的信息还在task列表和workflow history列表中, 但是在workflow与列表项之间的关联关系已经被从数据库中清除掉了.
即使workflow auto cleanup作业将workflow与一个文档之间的association溢出了, workflow的历史仍然是会存储在一个单独的列表中的. 这是个隐藏的列表, 叫做"workflow history". 所有与一个给定文档相关的workflow都是可见的, 只是存储的格式不容易阅读.
将文档与各自的workflow历史信息联系起来的最佳的解决方案, 是能够从隐藏的列表中捞出信息, 使之与文档的属性对应起来.
具体的步骤在Workaround for missing workflow history文章中有详细的步骤.
思想陈述如下:
所有信息都在, 只是关联关系不在了. 所以, 通过对workflow history列表创建一个新的view, 在加上对列的分组, 过滤, 就能达到查看特定文档的workflow的历史信息的目的了.
- 首先, 在workflow history中创建一个新的view, 其中包括user ID, event type, date occurred, outcome, description这些属性列.
- 选择按照创建日期属性列排序.
- 得到你想看的文档库的列表ID, 然后用这个ID作为workflow history列表的一个filter, 让这个view只显示你想要看到的列表中文档的记录.
- 然后按照primary item id对显示出来的项目进行分组, 这样, 根据所关联文档的不同, workflow就分类的挂在了关联的文档之下了.
- 这之后再按照workflow history parent instance再进行一次分组, 这样同一个文档开启不同的workflow也都分类地聚在一起了.
效果图应该是这样
下一步就是在文档库中为文档添加一个属性, 点击这个属性就会导航到workflow history列表中的我们刚刚创建好的view里的这个文档的部分. 从而完成对应关系, 也就完成了我们的最终目的, 查看60天以前的workflow的信息.
添加这个属性的column的过程中, 最重要的一环就是为这个属性添加一个计算公式.
公式如下:
=CONCATENATE("http://sharepointserver/Docs/Lists/Workflow%20History/auditview.aspx?View=%7B426D5F02-A5D0-4E8E-AC13-4388C179D8ED%7D&FilterField1=Item&FilterValue1=",RIGHT(DocID,LEN(DocID)-SEARCH("-",DocID,1)))
注意, 这里的view的ID是可以通过创建了之后的view页面上方的IE地址栏中拷贝得到的.
关于这个公式中的函数的信息, 请参考:
Formulas and Functions
http://office.microsoft.com/en-us/sharepointtechnology/CH011711541033.aspx
2011-07-13 更新:
经过测试, 上面列出的公式有点问题, 下面的公式在SharePoint 2007和SharePoint 2010下均测试通过
原文地址:
Disable automatic cleanup of workflow history (这篇文章有错误, 原文的后面列出了一篇文章其中的内容对其进行了纠正.)
http://technet.microsoft.com/en-us/library/cc298800.aspx
Workflow Scalability and Performance in Windows SharePoint Services 3.0
http://msdn.microsoft.com/en-us/library/dd441390.aspx
Changing the SPWorkflowAssociation.AutoCleanupDays property
Workaround for Missing Workflow History