Workflow Dynamics CRM工作流因无限循环检测而失败-但为什么?

Workflow Dynamics CRM工作流因无限循环检测而失败-但为什么?,workflow,dynamics-crm-online,dynamics-crm-2015,Workflow,Dynamics Crm Online,Dynamics Crm 2015,我想每30分钟运行一个插件,以轮询外部系统的更改。我在CRM Online中,所以我没有现成的访问调度引擎的权限 为了运行插件,我有一个带有时区独立日期的“触发器”实体- 更新该字段还会触发工作流,该工作流在伪代码中具有以下逻辑: If (Trigger_WaitUntil >= [Process-Execution Time]) { Timeout until Trigger:WaitUntil { Set Trigger_WaitUntil to [Process-Ex

我想每30分钟运行一个插件,以轮询外部系统的更改。我在CRM Online中,所以我没有现成的访问调度引擎的权限

为了运行插件,我有一个带有时区独立日期的“触发器”实体- 更新该字段还会触发工作流,该工作流在伪代码中具有以下逻辑:

If (Trigger_WaitUntil >= [Process-Execution Time])
{
  Timeout until Trigger:WaitUntil
  {
    Set Trigger_WaitUntil to [Process-Execution Time] + 30 minutes
    Stop Workflow with status of: Succeeded
  }
}
If Trigger_WaitUntil < [Process-Execution Time]) 
{
  Send email //Tell an admin that the recurring task has self-terminated
  Stop Workflow with status of: Canceled
}
因此,我期望的行为是,每隔30分钟,“WaitUntil”字段就会更新,插件和工作流会再次触发;除非等待日期早于执行时间,否则停止工作流

但是,4小时左右之后可能会执行8次,尽管我还没有验证是否收到无限循环警告,但此工作流作业已被取消,因为启动它的工作流包含无限循环。请更正工作流逻辑,然后重试。有关工作流的信息,请参阅


我的问题是为什么?工作流是否具有与插件类似的关联id,该id将传递到子工作流?如果是这样的话,我是否可以防止这种情况发生,同时保持使用单个触发器记录来管理计划的当前基本机制我见过其他解决方案,其中工作流会创建新记录,但是您还必须到处清理旧的触发器记录是的,这种行为是众所周知的。在Dynamics CRM中实现循环工作流而不出现无限循环问题并且只使用OOB功能的唯一方法是使用批量删除功能。本文介绍了如何实施它-


UPD:如果您希望每30分钟运行一次代码,那么您必须创建48个批量删除作业,并使用相应的startdatetime,如12:00、12:30、1:00…

CRM当前支持的方法是使用

摘录:

创建Web API应用程序以与CRM和外部 提供程序运行在共享的免费Azure网站上,并利用 Azure计划程序用于管理重复模式

Azure调度器的免费版本将我们限制为不再执行 每小时不超过一次,最多5份工作。如果你有很多事情要做 每月20美元可以让你每分钟执行死刑,最多50个工作- 听起来是个不错的交易


因此,如果您希望每30分钟创建一次,您可以创建两个作业,一个在半小时内,一个在小时内。

批量删除是一项有趣的工作,我们以前使用过。但这会增加额外的工作和维护,所以我尽量避免

我通常会建议您构建一个windows应用程序,并使用windows调度功能。我知道您说过您没有可用的调度程序,但这通常会被忘记。这种方法非常有效,并且很容易进行故障排除。写入日志和发送错误电子邮件警报很容易使其变得健壮。服务器不需要从外部访问,它只需要访问CRM。如果您在prem上有CRM,您可以使用相同的服务器

Azure调度器是一个很好的建议。这让你在云端,这很好

SSIS是另一种选择,如果你已经有了金斯威夫特或舒适的Roc


您可以构建一个工作流,创建另一个记录并在其自身之后进行清理;然而,这实际上是在为工作使用错误的工具。此外,它很容易失败,然后不启动下一条记录。

有一种解决方案称为计划工作流运行器。您可以创建一个FetchXML查询来创建一个要运行的记录集,并将其指向您希望在每个记录上运行的按需工作流。
我肯定会考虑使用大容量删除技术来完成日常工作;但是我最初的请求是以30分钟为周期的,我不知道有什么合理的方法可以让批量删除来完成这一任务,我在脑海中一直在想使用Azure,因此将指针指向Jason的示例非常有用。非常感谢。