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的步骤

  1. From Central Administration, click the Operations tab on the top navigation bar.

  2. On the Operations page, in the Global Configuration section, click Timer job definitions.

  3. On the Timer Job Definitions page, click Workflow Auto Cleanup to edit the appropriate timer job.

  4. 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的历史信息的目的了.

  1. 首先, 在workflow history中创建一个新的view, 其中包括user ID, event type, date occurred, outcome, description这些属性列.
  2. 选择按照创建日期属性列排序.
  3. 得到你想看的文档库的列表ID, 然后用这个ID作为workflow history列表的一个filter, 让这个view只显示你想要看到的列表中文档的记录.
  4. 然后按照primary item id对显示出来的项目进行分组, 这样, 根据所关联文档的不同, workflow就分类的挂在了关联的文档之下了.
  5. 这之后再按照workflow history parent instance再进行一次分组, 这样同一个文档开启不同的workflow也都分类地聚在一起了.

效果图应该是这样

1-27-2010 12-52-58 AM

 

下一步就是在文档库中为文档添加一个属性, 点击这个属性就会导航到workflow history列表中的我们刚刚创建好的view里的这个文档的部分. 从而完成对应关系, 也就完成了我们的最终目的, 查看60天以前的workflow的信息.

 

添加这个属性的column的过程中, 最重要的一环就是为这个属性添加一个计算公式.

1-27-2010 12-58-45 AM

公式如下:

=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下均测试通过

=CONCATENATE("http://sharepointserver/Docs/Lists/Workflow%20History/auditview.aspx?View=%7B426D5F02-A5D0-4E8E-AC13-4388C179D8ED%7D&FilterField1=Item&FilterValue1=",ID)

 

原文地址:

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

http://blogs.msdn.com/nishand/archive/2007/09/10/changing-the-spworkflowassociation-autocleanupdays-property.aspx

Workaround for Missing Workflow History

http://www.sharepointblogs.com/drewdevo/archive/2008/08/27/workaround-for-missing-workflow-history.aspx

posted on 2010-01-27 01:07  中道学友  阅读(1473)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上