为什么我的CRM 4.0工作流(workflows)老是在等待状态?

如果你部分工作流被发现总是失败,或者处于等待状态,你应该检查如下通常的错误:

 

1. 工作流里试图更新某个已经关闭的记录。

CRM里的规则是不允许更新已经关闭的记录,否则workflow会被报错。

解决办法: 对于更新记录,最佳步骤是先检查该记录的状态是否处于开启状态;如果已经关闭无论如何你重试工作流都会失败。

WaitWF-1

 

2. 工作流程使用”等待条件”时候条件设置过于宽松使得条件不容易满足导致工作流永远处于等待状态。

解决办法: 在使用”等待条件”时候尽量增加一个”并行等待分支”。”并行等待分支”并发执行,任何一个条件满足工作流程都能继续下去。如下例中考虑了无限等待的情况,所以使用了超时作为并行等待分支的一个条件。

WaitWF-2

 

3. 工作流程定义中依赖的某些属性为空

比如工作流程里使用某个联系人的email地址,这种情况就要保证email address这个属性属于强制需求的。

 

4. 触发了死循环 (loop detection)

症状场景: CRM 4.0里增加了死循环检测机制 -- 在60分钟内如果一个工作流程被重复触发7次,那么第8次该工作流会被自动停止。比如: 有2个工作流程分别定义在account和task上。一个工作流程为新建account的时候添加一条task 记录,而另一个为新建task时候创建相应的Account记录。这种情况工作流会被执行第8次前被停止。 再比如你有个主工作流,调用8个一个子工作流程,那么不注意也容易触发8次限制。

 

触发了8次循环限制的工作流程会报告错误为 “This workflow job was canceled because the workflow that started it included an infinite loop. Correct the workflow logic and try again. For information about workflow logic, see Help”,错误号为0x80044182.

 

如果你打开CRM Trace在W3WP日志里循环次数会被跟踪为Depth:

比如:

MessageProcessor start processing message:'RetrieveMultiple' for entity:'msft_statusreasonrepairpart' correlationId:4c8ecaf1-6cad-45db-89e7-3e93ff7532cb depth:2 last updated at: 2009-02-09T06:00:35Z.

解决办法:

如果你的系统确实需要突破60分钟内自循环超过8次, 这个8次循环限制可以使用DeploymentConfig工具调整 (存储在MSCRM_CONFIG库表DeploymentProperties的MessageProcessorMaximumDepth), 但是60分钟不能修改(MessageProcessorMinimumInactiveSeconds=3600 seconds).

CRM 4.0 Deployment Config Tool

命令行:  c:\>microsoft.crm.deploymentconfigtool.exe workflowsettings update -maximumdepth:10

 

5. 你可以使用如下SQL查询语句来统计到底系统有多少工作流程处于等待状态:

SELECT operationtype, statecode, statuscode, count (*)

FROM asyncoperationbase

GROUP by operationtype, statecode, statuscode

ORDER by operationtype, statecode, statuscode

 

OperationType=10: 工作流

https://msdn.microsoft.com/en-us/library/bb890231.aspx

 

如果有大量处于等待状态工作流程你打算清除,可以参看批量删除工具

SDK Cleanup script for unwanted Workflow Instances stuck in Waiting… state

 

6. 编写工作流程的负责人(owner)安全权限更改了

非按需运行的工作流程 (即非手动运行工作流)运行在创建者的安全账户下 (参看MSCRM 4.0 用什么身份来执行工作流中的操作)。容易犯错的地方是:

CRM合作伙伴/顾问安装部署CRM方案时候使用自己的账户创建了很多工作流程,这些流程的负责人owner就变成了部署顾问;部署完毕后通常这些顾问的账户会被禁止或者降级为只读(read-only). 这种情形下工作流程是无法执行下去的。

 

thanks

Clifford