更新
我应该从一开始就添加-这是在Microsoft Dynamics CRM 2011中。
我非常了解CRM,但我无法解释我当前部署的行为。
请阅读我的设想大纲,以帮助我理解我的假设/理解中哪些是错误的(因此是什么导致了这个错误)。这不符合我的预期。
基本情景
简单地说,是标准的无限循环检测。我理解这个概念及其存在的原因。
具体部署
首先,我认为在这个场景中忽略插件代码的内容是非常安全的。它工作得很好,它是原子的,几乎不涉及CRM (要明确的是,它是一个事件前插件,运行远程web服务,等待响应,然后在我的触发器记录上设置“已完成的”日期/时间属性,然后将Target实体传回管道)。只要创建了触发器记录,这段代码就会运行并执行它应该做的事情。
在扣除插件的内容后,我可能不喜欢在实体的预创建步骤上注册插件.
这就留下了工作流本身。很简单。它运行得很好:
有了这个设置,我手动创建了一个新的触发器记录,并且这个过程可以很好地旋转起来。前滚1小时58分钟(根据我运行的最后一个周期-记住我的插件代码可能需要一分钟才能完成运行),在7个成功的执行周期(即创建和完成新的工作流作业)之后,第8个失败了前面提到的错误。
我已经知道的(纠正我错的地方)
默认情况下,递归深度设置为8。。如果一个工作流/插件调用自己8次,那么就会检测到一个无限循环。
递归深度每一小时重置一次。 (或10分钟-见链接博客中的“警告”?)
递归深度设置可以通过PowerShell设置。或SDK代码仅在前提部署(通过Set- Cmdlet)中使用部署Web服务
我不想听到的(请)
“更改递归深度设置”
我不能更改部署递归深度设置,因为这不是在线场景中的选项--最终,我也将部署到CRM online。
“增加工作流的超时时间”
这也不是一种选择--重新索引需要每15分钟进行一次,最好是更快。
更新
@Boone在下面建议,递归深度超时是在不活动 60分钟之后而不是每60分钟重置一次。其中存在着第一个误解。
在与@alex讨论时,我建议在通过工作流创建实体和最终生成的工作流之间可能存在一些持久的CorrelationId。当然有了。CorrelationId在插件和工作流以及从该线程产生的任何记录中都是相同的。我现在正在研究将CorrelationId (或者创建记录)与实体和工作流分离开来的方法。
发布于 2012-05-15 12:48:57
对于一个小时的“重置”发生,你必须有一个小时没有活动。它不会从原来的一个小时内重置。因此,既然你每15分钟就有一次活动,它就永远没有机会重置。我不知道在任何地方都这么说.但根据我的经验。
在CRM4中,可以创建一个create (谷歌在子管道中创建CRM服务)并重置相关ID (使用CorrelationToken.NewToken())。在2011年的SDK中,我没有看到任何事情那么容易。不知道这个伎俩在网络环境中是否有效。2011年在线向后兼容CRM 4插件吗?
您可以尝试的一件事是使用IExecutionContext.CorrelationId来清除异步操作(系统作业)表。但是根据元数据,我认为可能有用的属性(CorrelationId、CorrelationUpdatedTime、Depth)对更新无效。也许你可以删除行?即使这样也无济于事。
https://stackoverflow.com/questions/10600161
复制相似问题