8

更新

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


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

请阅读我的场景大纲,以帮助我了解我的哪些假设/理解是错误的(以及导致此错误的原因)。这与我的预期不一致。

基本场景

  • 要求要求每 X 分钟调用一次 Web 服务(它将待处理项目添加到数据库索引)
  • 我选择使用工作流/自定义实体触发器模型(即我有一个自定义实体,它注册了一个 CREATE 插件。该插件执行我的逻辑。伴随的工作流在“完成”时间 + [超时期限]到期时启动。到期时,它会创建一个新的触发记录并且工作流结束)。
  • 插件逻辑工作得很好。工作流概念在一定程度上可以正常工作,但一段时间后工作流会因失败而停止:

    此工作流作业已取消,因为启动它的工作流包含无限循环。更正工作流逻辑并重试。有关工作流逻辑的信息,请参阅帮助。

简而言之 - 标准无限循环检测。我理解这个概念及其存在的原因。

具体部署

首先,我认为在这种情况下忽略插件代码的内容对我们来说是相当安全的。它工作正常,它是原子的,几乎不涉及 CRM(需要明确的是,它是一个事件前插件,它运行远程 Web 服务,等待响应,然后在通过之前在我的触发器记录上设置“完成时间”日期/时间属性目标实体回到管道中)。只要创建了触发器记录,此代码就会运行并执行应有的操作。

打折插件的内容后,在实体的预创建步骤中注册插件时可能存在我不喜欢的问题......

这样就剩下工作流程本身了。这是一个简单的。它是这样运行的:

  1. 在创建新的触发器实体时...
  2. 它的超时时间为 Trigger.new_completedon + 15 分钟
  3. 在超时时,它会创建一个新的触发器记录(没有“完成”值 - 这是由插件设置的记住)
  4. 仅此而已-没有明确的“结束工作流程”(尽管我现在刚刚添加了一个并将其设置为测试...)

有了这个设置,我手动创建了一个新的触发器记录,这个过程很好地付诸行动。前滚 1 小时 58 分钟(基于我运行的最后一个周期 - 记住我的插件代码可能需要一分钟才能完成运行),在 7 个成功执行周期(即创建和完成新的工作流作业)之后,第 8 个失败并出现上述错误。

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

默认情况下,递归深度设置为 8。如果工作流/插件调用自身 8 次,则检测到无限循环。

递归深度每隔一小时或 10 分钟 - 请参阅链接博客中的“警告”?)

递归深度设置只能通过 PowerShell或 SDK 代码在本地部署中使用部署Web 服务 进行设置(通过 Set-CrmSetting Cmdlet

我不想听的(请)

“更改递归深度设置”

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

"增加工作流的超时时间"

这也不是一个选项 - 重新索引需要每 15 分钟发生一次,最好更快。

更新

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

在与@alex 讨论时,我建议在通过工作流创建实体和最终生成的工作流之间可能存在一些 CorrelationId 的持久性......嗯。CorrelationId 在插件和工作流以及从该线程假脱机的任何记录中都是相同的。我现在正在寻找将 CorrelationId(或者可能是记录的创建)与实体和工作流分离的方法。

4

2 回答 2

3

我怀疑这可以像这样解决。

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

更新

或者,您可以在插件中的 crm 服务初始化时尝试这样的操作(从我的一个插件中挖掘出来),而不会影响您的工作流程:

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 年前),但它可能会有所帮助。

于 2012-05-15T12:10:32.660 回答
3

要进行一小时的“重置”,您必须一小时内没有活动。它不会从原来的 1 小时内重置。因此,由于您每 15 分钟进行一次活动,因此它永远没有机会重置。我不知道任何地方都这么说……但根据我的经验。

在 CRM 4 中,可以创建 CRM 服务(Google在子管道中创建 CRM 服务)并重置关联 ID(使用 CorrelationToken.NewToken())。我在 2011 SDK 中没有看到这么简单的东西。不知道这个技巧是否适用于在线环境。2011在线是否向后兼容CRM 4插件?

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

于 2012-05-15T12:48:57.610 回答