SharePoint工作流计时器作业卡在"暂停"状态

症状

在SharePoint管理中心中,工作流计时器作业将状态显示为"暂停"。 因此,您遇到以下问题:

  • 任务审批无法完成。
  • 工作流在暂停后无法运行。
  • 发生工作流的随机处理。
  • 工作流不会长时间运行。

原因

最可能原因是工作流实例错误。

解决方案

若要解决此问题,请首先确定它是由系统中引入的工作流定义引起的,还是由错误的工作流实例导致的。 确认后,与工作流所有者一起决定是否可以终止或删除工作流。

若要快速诊断问题,请考虑在除一个服务器SharePoint所有服务器上停止 Microsoft SharePoint Foundation 工作流定时服务。

步骤 2:将 ULS 日志记录级别设置为 VerboseEx

在"SharePoint命令行管理程序"中,运行以下命令:

Set-SPLogLevel -TraceSeverity VerboseEx  

注意 这可能会导致服务器场出现性能问题。 建议您将持续时间限制为最小值,并且使用 Clear-SPLogLevel重现行为后,将 ULS 日志记录级别重置为默认值。

如果性能影响阻止完全 VerboseEx 跟踪,则所有类别的日志记录级别设置为 Verbose, 将 SharePoint 2010) 中的"旧工作流基础结构" (或"工作流基础结构"的日志记录级别设置为 VerboseEx。 为此,请运行命令行管理程序SharePoint命令:

Set-SPLogLevel -TraceSeverity Verbose   
Set-SPLogLevel -TraceSeverity VerboseEx -Identity "Legacy Workflow Infrastructure"  
Set-SPLogLevel -TraceSeverity VerboseEx -Identity "Timer"  

步骤 3:清除配置缓存

清除工作流计时器作业卡住的所有服务器上以及启动 Microsoft SharePoint Foundation 工作流定时服务的服务器上配置缓存。

步骤 4:等待问题再次发生并收集 ULS 日志

清除配置缓存后,工作流计时器作业的状态会从"暂停"更改为"已暂停",然后"正在运行"。 等待问题发生,这通常需要 10 分钟。 如果工作流计时器作业可以在另一台服务器上运行,您可能也会看到该作业在另一台服务器上启动。

每五分钟检查一次 ULS 日志,以查看问题是否已重现,并且计时器作业卡住。 在计时器作业状态变为"暂停"之前,问题将显示在 ULS 日志中。 如果在 ULS 日志中没有创建"计时器作业作业工作流"的新条目,计时器作业将卡住。 发生这种情况时,使用下列条件筛选 ULS 日志并检查最后一项的时间:

 Name  Contains  Timer Job job-workflow

步骤 5:检查 ULS 日志

  1. 在 ULS 查看器中打开 ULS 日志,然后应用以下筛选器:

    Name  Contains  job-workflow  
    EventID  Contains  ahk8y
    
  2. 查找正在处理的最后一个工作流。 很可能,这是导致问题的工作流实例。 下面是一个示例:

    SharePoint Foundation Legacy Workflow Infrastructure ahk8y Verbose In RunWorkflowElev(), begin processing events for instance: bb7e3f4f-74ac-43f7-a31e-faa7e900843e      8329f59d-0342-20c3-fa1a-56f9161ded9f
    
  3. 清除所有筛选器,然后应用以下筛选器:

    Correlation Equals <Correlation_ID> And
    邮件包含proc_GetWorkflowAssociations和
    [EventID 包含 b6p4 Or
    EventID 包含 tzkv ]

    在示例中,相关 ID 为 8329f59d-0342-20c3-fa1a-56f9161ded9f。

  4. 找到最后一次出现的 b6p4tzkv 事件,然后查找 ListId、SiteId、ItemId 和 WebId。 下面是一个示例:

    05/25/2017 12:28:43.27 OWSTIMER.EXE (0x9318) 0x6DF0 SharePoint Foundation Database b6p4 VerboseEx SqlCommand: ; EXEC proc_getworkflowassociations '8dd5c889-47a6-4798-93ef-8652609278f4', 'j3952987-5ca6-4eae-8530-13e83acf1bb0', 'e22969ea-f883-4e99-8cbd-4b799a884d2d', 'm82r99b0-ff01-4448-9907-e2cbbbca0586', @contenttypeid, @RequestGuid OUTPUT 8329f59d-0342-20c3-fa1a-56f9161ded9f   
    05/25/2017 12:28:43.27 OWSTIMER.EXE (0x9318) 0x6DF0 SharePoint Foundation Database tzkv Verbose SqlCommand: 'proc_GetWorkflowAssociations' CommandType: StoredProcedure CommandTimeout: 0 Parameter: '@RETURN_VALUE' Type: Int Size: 0 Direction: ReturnValue Value: Parameter: '@SiteId' Type: UniqueIdentifier Size: 0 Direction: Input Value: '8dd5c889-47a6-4798-93ef-8652609278f4' Parameter: '@WebId' Type: UniqueIdentifier Size: 0 Direction: Input Value: 'j3952987-5ca6-4eae-8530-13e83acf1bb0' Parameter: '@Id' Type: UniqueIdentifier Size: 0 Direction: Input Value: 'e22969ea-f883-4e99-8cbd-4b799a884d2d' Parameter: '@ListId' Type: UniqueIdentifier Size: 0 Direction: Input Value: 'm82r99b0-ff01-4448-9907-e2cbbbca0586' Parameter: '@ContentTypeId' Type: VarBinary Size: 512 Direction: Input Value: Parameter: '@RequestGuid' Type: UniqueIdentifier Size: 0 Direction: Input Value: '8329f59d-0342-20c3-fa1a-56f9161ded9f' 8329f59d-0342-20c3-fa1a-56f9161ded9f
    

    在示例中, ListId 为 m82r99b0-ff01-4448-9907-e2cbbbca0586,SiteId8dd5c889-47a6-4798-93ef-8652609278f4。 ItemId 为 e22969ea-f883-4e99-8cbd-4b799a884d2d,WebIdj3952987-5ca6-4eae-8530-13e83acf1bb0

步骤 6:确定工作流

在SharePoint命令行管理程序中,运行以下命令以查找 Web URL 和列表标题:

 $web= (Get-SPSite -Identity <SiteId> |Get-SPWeb -Identity <WebId>)   
 $list = $web.Lists.GetList("<ListId>", $true)  
 $list.ParentWeb   
 $list.Title

注释 SiteId、WebIdListId 是步骤 5 中发现的 SiteId、WebId 和 ListId 的占位符。

转到列表,然后使用 ItemId 查找项。 还可以在列表上创建一个临时视图,然后按 ITEMID 进行筛选。 有问题的工作流与项目关联。 转到项目的工作流设置。 如果项目上有多个工作流在运行,请单击有问题的工作流的状态列以查看工作流历史记录页。

步骤 7:终止工作流

检查工作流历史记录以找出错误。 然后,您可以终止工作流或删除项目。

有时,您可能未在步骤 6 中标识工作流或项目。 在这种情况下,请确保查看正确的列表并检查所有其他数据部分。 此外,检查回收站。

如果仍然找不到项目或工作流,则该项目可能已删除,但工作流实例仍在运行。 在这种情况下,在命令行管理程序中SharePoint以下命令以取消工作流:

$web = Get-SPWeb <WebURL>  
#Pass the workflow Instance Id from the ahk8y event  
$WorkflowInstanceID = <WorkflowInstanceID>  
$workflowId =  [GUID]$WorkflowInstanceID  
$workflow = New-Object Microsoft.SharePoint.Workflow.SPWorkflow($web, $workflowId);  
[Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($workflow)

更多信息

仍然需要帮助? 请转到 SharePoint 社区