首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在我的CRM工作流中会触发无限循环保护?

为什么在我的CRM工作流中会触发无限循环保护?
EN

Stack Overflow用户
提问于 2012-05-15 11:55:23
回答 2查看 11.4K关注 0票数 8

更新

我应该从一开始就添加-这是在Microsoft Dynamics CRM 2011中。

我非常了解CRM,但我无法解释我当前部署的行为。

请阅读我的设想大纲,以帮助我理解我的假设/理解中哪些是错误的(因此是什么导致了这个错误)。这不符合我的预期。

基本情景

  • 需求要求每隔X分钟调用一个web服务(它将挂起的项添加到数据库索引中)
  • 我选择使用工作流/自定义实体触发器模型(即,我有一个注册了CREATE的自定义实体。插件执行我的逻辑。当“完成”时间+超时期间到期时,将启动伴随的工作流。到期时,它将创建一个新的触发器记录,工作流结束)。
  • 插件逻辑工作得很好。工作流概念在一定程度上运作良好,但经过一段时间之后,工作流会因失败而停滞: 此工作流作业被取消,因为启动它的工作流包含一个无限循环。更正工作流逻辑,然后再试一次。有关工作流逻辑的信息,请参阅帮助。

简单地说,是标准的无限循环检测。我理解这个概念及其存在的原因。

具体部署

首先,我认为在这个场景中忽略插件代码的内容是非常安全的。它工作得很好,它是原子的,几乎不涉及CRM (要明确的是,它是一个事件前插件,运行远程web服务,等待响应,然后在我的触发器记录上设置“已完成的”日期/时间属性,然后将Target实体传回管道)。只要创建了触发器记录,这段代码就会运行并执行它应该做的事情。

在扣除插件的内容后,我可能不喜欢在实体的预创建步骤上注册插件.

这就留下了工作流本身。很简单。它运行得很好:

  1. 创建一个新的触发实体..。
  2. 它有一个超时的Trigger.new_completedon + 15分钟
  3. 超时时,它会创建一个新的触发器记录(没有“已完成”值--这是由插件记住设置的)。
  4. 这就是全部-没有明确的“结束工作流”(虽然我刚刚添加了一个,并将对其进行测试.)

有了这个设置,我手动创建了一个新的触发器记录,并且这个过程可以很好地旋转起来。前滚1小时58分钟(根据我运行的最后一个周期-记住我的插件代码可能需要一分钟才能完成运行),在7个成功的执行周期(即创建和完成新的工作流作业)之后,第8个失败了前面提到的错误。

我已经知道的(纠正我错的地方)

默认情况下,递归深度设置为8。。如果一个工作流/插件调用自己8次,那么就会检测到一个无限循环。

递归深度每一小时重置一次。 (或10分钟-见链接博客中的“警告”?)

递归深度设置可以通过PowerShell设置。或SDK代码仅在前提部署(通过Set- Cmdlet)中使用部署Web服务

我不想听到的(请)

“更改递归深度设置”

我不能更改部署递归深度设置,因为这不是在线场景中的选项--最终,我也将部署到CRM online。

增加工作流的超时时间”

这也不是一种选择--重新索引需要每15分钟进行一次,最好是更快。

更新

@Boone在下面建议,递归深度超时是在不活动 60分钟之后而不是每60分钟重置一次。其中存在着第一个误解。

在与@alex讨论时,我建议在通过工作流创建实体和最终生成的工作流之间可能存在一些持久的CorrelationId。当然有了。CorrelationId在插件和工作流以及从该线程产生的任何记录中都是相同的。我现在正在研究将CorrelationId (或者创建记录)与实体和工作流分离开来的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-15 12:48:57

对于一个小时的“重置”发生,你必须有一个小时没有活动。它不会从原来的一个小时内重置。因此,既然你每15分钟就有一次活动,它就永远没有机会重置。我不知道在任何地方都这么说.但根据我的经验。

在CRM4中,可以创建一个create (谷歌在子管道中创建CRM服务)并重置相关ID (使用CorrelationToken.NewToken())。在2011年的SDK中,我没有看到任何事情那么容易。不知道这个伎俩在网络环境中是否有效。2011年在线向后兼容CRM 4插件吗?

您可以尝试的一件事是使用IExecutionContext.CorrelationId来清除异步操作(系统作业)表。但是根据元数据,我认为可能有用的属性(CorrelationId、CorrelationUpdatedTime、Depth)对更新无效。也许你可以删除行?即使这样也无济于事。

票数 3
EN

Stack Overflow用户

发布于 2012-05-15 12:10:32

我怀疑这件事能这样解决。

我建议一种不同的方法:在CRM的同时部署一个简单的应用程序,让它调用web服务,而web服务又可以使用XRM端点来更改记录。

更新

或者,您可以在您的crm服务初始化插件(从我的一个插件中挖掘出来)中尝试这样的方法,让您的工作流程保持不变:

代码语言:javascript
复制
CrmService service = new CrmService();
//initialize service here, then...

CorrelationToken newtoken = new CorrelationToken();
newtoken.CorrelationId = context.CorrelationId;
newtoken.CorrelationUpdatedTime = context.CorrelationUpdatedTime;

// WILD GUESS: Enforce unlimited depth ?
corToken.Depth = 0; // THIS WAS: context.Depth;

//updating correlation token
service.CorrelationTokenValue = corToken;

我承认我对此不太记得了(代码可以追溯到2年前),但可能会有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10600161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档