更新
我应该从一开始就添加 - 这是在 Microsoft Dynamics CRM 2011中
我很了解 CRM,但我无法解释我当前部署的行为。
请阅读我的场景大纲,以帮助我了解我的哪些假设/理解是错误的(以及导致此错误的原因)。这与我的预期不一致。
基本场景
- 要求要求每 X 分钟调用一次 Web 服务(它将待处理项目添加到数据库索引)
- 我选择使用工作流/自定义实体触发器模型(即我有一个自定义实体,它注册了一个 CREATE 插件。该插件执行我的逻辑。伴随的工作流在“完成”时间 + [超时期限]到期时启动。到期时,它会创建一个新的触发记录并且工作流结束)。
- 插件逻辑工作得很好。工作流概念在一定程度上可以正常工作,但一段时间后工作流会因失败而停止:
此工作流作业已取消,因为启动它的工作流包含无限循环。更正工作流逻辑并重试。有关工作流逻辑的信息,请参阅帮助。
具体部署
首先,我认为在这种情况下忽略插件代码的内容对我们来说是相当安全的。它工作正常,它是原子的,几乎不涉及 CRM(需要明确的是,它是一个事件前插件,它运行远程 Web 服务,等待响应,然后在通过之前在我的触发器记录上设置“完成时间”日期/时间属性目标实体回到管道中)。只要创建了触发器记录,此代码就会运行并执行应有的操作。
打折插件的内容后,在实体的预创建步骤中注册插件时可能存在我不喜欢的问题......
这样就剩下工作流程本身了。这是一个简单的。它是这样运行的:
- 在创建新的触发器实体时...
- 它的超时时间为 Trigger.new_completedon + 15 分钟
- 在超时时,它会创建一个新的触发器记录(没有“完成”值 - 这是由插件设置的记住)
- 仅此而已-没有明确的“结束工作流程”(尽管我现在刚刚添加了一个并将其设置为测试...)
有了这个设置,我手动创建了一个新的触发器记录,这个过程很好地付诸行动。前滚 1 小时 58 分钟(基于我运行的最后一个周期 - 记住我的插件代码可能需要一分钟才能完成运行),在 7 个成功执行周期(即创建和完成新的工作流作业)之后,第 8 个失败并出现上述错误。
我已经知道的(纠正我错的地方)
默认情况下,递归深度设置为 8。如果工作流/插件调用自身 8 次,则检测到无限循环。
递归深度每隔一小时(或 10 分钟 - 请参阅链接博客中的“警告”?)
递归深度设置只能通过 PowerShell或 SDK 代码在本地部署中使用部署Web 服务 进行设置(通过 Set-CrmSetting Cmdlet)
我不想听的(请)
“更改递归深度设置”
我无法更改部署递归深度设置,因为这不是在线场景中的选项 - 最终我也将部署到 CRM Online。
"增加工作流的超时时间"
这也不是一个选项 - 重新索引需要每 15 分钟发生一次,最好更快。
更新
@Boone 在下面建议递归深度超时在 60 分钟不活动后重置,而不是每 60 分钟重置一次。第一个误解就在于此。
在与@alex 讨论时,我建议在通过工作流创建实体和最终生成的工作流之间可能存在一些 CorrelationId 的持久性......嗯。CorrelationId 在插件和工作流以及从该线程假脱机的任何记录中都是相同的。我现在正在寻找将 CorrelationId(或者可能是记录的创建)与实体和工作流分离的方法。