Dynamics 365同一个消息的多个插件步骤执行时间较长的测试

Posted luoyong0201

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dynamics 365同一个消息的多个插件步骤执行时间较长的测试相关的知识,希望对你有一定的参考价值。

我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复457或者20210928可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

我们知道单个插件步骤或者自定义工作流活动如果在2分钟内如果没有执行完毕的话就会被强行终止,并抛出异常,但是如果是一个Message触发多个插件呢,怎么计算?带着这个疑问,我今天来实际验证一下。 

首先记录下我测试的Dynamics 365版本信息如下:

首先我用如下代码注册一个Update消息的Pre Operation阶段的插件:

using Microsoft.Xrm.Sdk;
using System;
using System.Threading;

namespace D365.Plugins
{
public class DistrictPreUpdate : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
tracingService.Trace($"Enter DistrictPreUpdate on {DateTime.UtcNow.ToString()}");
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
//插件针对的当前实体记录,对于Pre Create来讲,该对象包括了所有设置的字段值,若字段没有设置值,在该对象中会不存在
Entity currentEntity = (Entity)context.InputParameters["Target"];
Thread.Sleep(129000);
}
}
}
}


如果触发这个插件的话,等到2分钟会弹出如下错误提示框:


下载详细的错误详细信息如下:


Exception Message: An unexpected error occurred from ISV code. (ErrorType = ClientError) Unexpected exception from plug-in (Execute):  D365.Plugins.DistrictPreUpdate: System.TimeoutException: Couldn’t complete execution of the D365.Plugins.DistrictPreUpdate plug-in within the 2-minute limit.

ErrorCode: -2147220956
HexErrorCode: 0x80040224

HelpLink: http://go.microsoft.com/fwlink/?LinkID=398563&error=Microsoft.Crm.CrmException%3a80040224&client=platform

TraceText:
[D365.Plugins: D365.Plugins.DistrictPreUpdate]
[46ba37c7-4b20-ec11-b6e6-000d3a8520a1: D365.Plugins.DistrictPreUpdate: Update of ly_district]


Enter DistrictPreUpdate on 9/28/2021 1:25:03 PM

Activity Id: f867b7ad-8ee3-4ec8-90f9-0370093d7b49


然后我修改下插件代码,让其等待100秒,再用如下代码注册一个同一个实体Update消息的Post Operation阶段的插件步骤:


using Microsoft.Xrm.Sdk;
using System;
using System.Threading;

namespace D365.Plugins
{
public class DistrictPostUpdate : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
tracingService.Trace($"Enter DistrictPostUpdate on {DateTime.UtcNow.ToString()}");
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
//插件针对的当前实体记录,对于Pre Create来讲,该对象包括了所有设置的字段值,若字段没有设置值,在该对象中会不存在
Entity currentEntity = (Entity)context.InputParameters["Target"];
Thread.Sleep(100000);
}
}
}
}


然后我去测试下,保存成功,看看插件日志,Pre Update插件耗时100秒,


Post Update插件代码也耗时100秒,加起来超过2分钟不少,而且可以看到 Pre Update代码执行开始时间比Post Update插件代码早100秒,是Pre Update代码执行完毕后才执行Post Update插件代码。


那你还会问,如果是注册在同一阶段的两个插件代码呢,我用Post Update几乎一样的代码再注册一个插件如下,也是在Update消息的Post Operation阶段,不过我将其Execution Order设置为2,让它执行在前面注册的Post Update插件之后。


然后我去测试下,发现等了一段时间后就报错如下:


从插件日志来看,三个插件步骤,每个运行了两次(或许三次),执行顺序一直是一样的,先是Pre Update的插件,然后是Post Update的插件,相同阶段的插件,Execution Order数字大的执行在数字小的后面。


然后我禁用Pre Update插件,只留下两个Post Update插件再测试下,可以正常更新,插件运行记录也显示Execution Order小的运行完毕后继续运行Execution Order大的,然后正常完成。


但是当我用同样的代码再增加一个Post Update插件,然后测试,保存就会报错了:


这个错误下载下来的错误信息文件类似如下:


Exception Message: This operation failed because you\'re offline. Reconnect and try again.

ErrorCode: -2147093999
HexErrorCode: 0x8005f211
Call Stack: Error: request failed with timeout
at https://luoweidemo.crm5.dynamics.com/uclient/scripts/33.js?v=1.4.3181-2109.1:387:640

Activity Id: 4ca98dcc-b654-4b8c-a10e-408b0dc93ab8


然后发现每个插件运行了至少三遍,这个应该是前端代码有个尝试机制,最多尝试三次,三次都没有成功的话前端就会报错,实际上插件执行是成功的,对记录字段值得更改也改过来了。


看来,单个插件执行时间不能太长(超过2分钟),一个消息的Pre Operation和Post Operation的插件执行时间总和也不能太长(似乎超过4分钟就会有问题的),太长的话前端会报错,会尝试最多三次。要想办法拆掉,如果不要求事务的话可以考虑我以前的方法:执行插件超过2分钟超时错误,如何办? ​​https://blog.51cto.com/luoyong/2667035​​ 。


以上是关于Dynamics 365同一个消息的多个插件步骤执行时间较长的测试的主要内容,如果未能解决你的问题,请参考以下文章

Dynamics 365 marketing中添加自定义渠道磁贴

Dynamics 365插件开发

如何通过 Dynamics 365 CRM 中的 C# 插件填充查找字段

Dynamics365 custom-plug-ins-should-not-catch-exceptions from OrganizationService

Dynamics365 custom-plug-ins-should-not-catch-exceptions from OrganizationService

Dynamics365 custom-plug-ins-should-not-catch-exceptions from OrganizationService