解决方案包含内容
功能介绍
项目中可能会遇到一些需要周期性批处理数据的需求,我们以往会通过计划任务、windows服务、或power automate去实现。
实体"Scheduled Process"是基于CRM本身的一种实现方式,很久以前其实就有类似的解决方案,但是随着版本升级,可能之前的方式会有一些局限性。
如IExecutionContext.Depth和插件事务管道的限制等等。
在运行周期过短,或相互调用插件、工作流的深度过多,就会出现“工作程包括无限循环”的错误。
针对该错误,OP其实可以通过power shell去调整,online也可以调整,但是可能会更复杂一些,个人认为还是不建议这样去做。
我尝试通过调用action去规避类似的错误,但只要是插件内通过组织服务去做基础请求(不论同步还是异步),不管是请求action,再从aciton做跳板去做其他处理,其实都是在事务管道内。
为了绕开插件内的事务管道,通过ExecuteMultipleRequest的方式可规避这个问题,问题得以解决。
实体
1、Scheduled Process
2、Scheduled Process Executive Logging
示例
按照执行类型可实现不同的配置,如果执行类型为"仅执行全局操作",那么,流程(工作流或action)仅可设置为全局的操作。
如图,每间隔1分钟,就会执行全局操作"测试操作"一次。
执行类型如为"根据FetchXml批量执行工作流或操作",那么,流程(工作流或action)可设置为操作或工作流,要注意,操作或工作流对应的实体要与FetchXml设置的实体保持一致,并且如果设置为工作流,请将工作流的"作为按需流程"选项勾选上。如图:每间隔1天,通过fetch xml查询"测试实体A"所有数据,将每一条数据去执行工作流"测试工作流A"
也可为需执行的操作传入固定的参数,如下图,参数可为多个,参数类型只支持字符串类型。
创建好记录,直接点击"发布计划"即可。
发布完成,会按照上面配置,自动创建一条子记录。当系统时间到下图的"下次执行时间"时,执行该计划。
如需调整执行时间,也可自行调整"下次执行时间"。
如需立即执行计划,可以点击"手动执行计划",如下图。
如需取消计划,点击"停止计划"即可。停止后,该条计划下所有子记录等待中的系统作业都会自动取消。
解析Fetch XML查询出来的数据,通过pagingCookie的方式,规避了只能处理5000条数据的问题。
而且考虑到,工作流或插件的执行超时时间为2分钟,这里我设置了个阈值,当数据达到这个值的时候,默认会拆分成多个不同的子流程进行数据处理。每个子流程处理阈值数量的数据,阈值默认为1000。
例如:需处理的数据为1万条,阈值设置为1000,那么主流程首先会自己处理1000条数据,再通过pagingCookie递归9次,启动9个子流程并行处理剩下的9000条数据。
这样既可以规避超时限制,又可以提升数据处理效率。
阈值设置的地方见下图。