本文介绍了在金蝶云星空系统中,针对网络环境复杂导致HTTP请求乱序的问题,提出了启用链式请求的解决方案。链式请求通过顺序执行每个请求来避免乱序,但可能影响请求性能。文章详细说明了启用链式请求的全局控制和个别控制方法,包括参数设置、编程和配置三种方式,并提供了Python插件代码示例。此外,还提及了启用链式请求后的互斥功能和校验工具使用,以及插件实现样例和注意事项。
本篇基础:BOS平台的二开编程(论坛),C#编程(ms),python语法,VistualStudio2012(up)工具(ms),CS的基础知识
启用链式请求(桌面客户端应用) PT145060 [7.5.1507.2] 发布时间:2019/12/31
有些客户的网络环境复杂,经过的路由网关较多,操作的请求频率又非常高,从而偶发性的出现非常相近的http(s)请求在网关部分可能引起乱序,针对这种特殊情况,可以考虑启用链式请求来规避这个问题,完整方案如下,请仔细阅读:
一、【乱序现象】:
先请求的连接却被延迟到后面32.351才响应,后请求的被提前31.992响应了,说明网络中的某个网关出现拥挤阻塞引发乱序,如下图:
二·、【方案说明】
由于金蝶云星空是云服务系统,客户端为更高效的利用资源启用的多任务并发请求。如果习惯用老系统的单任务模式,或者网络环境复杂,可考虑启用“链式请求”功能。
“链式请求”模式下,每个请求都要等待上个请求响应后才会发起,从而保证每个请求是顺序执行,并且返回指令也是按顺序返回。启用该模式后,请求性能将可能有一定程度下降的影响。
“链式请求”参数一旦启用,当前客户端运行实例的全局所有表单都生效,不是单据独立控制的,因为单据之间存在复杂的业务调用关系,如果局部生效会导致请求次序紊乱,导致业务执行错误。
三、【方案步骤】
注意:逻辑上启用【全局控制】就不需要做【个别控制】了。
(这里的个别控制是指个别用户控制。注意一旦启用,当前客户端运行实例的全局所有表单都生效)
1、【全局控制】以下3种方法可以任意选用一种
1.1、参数设置法:(私有云/公有云/单租户/多租户,功能版本:PT-146891 [7.7.0.202109] 7.7.2297.10 )
参考下图,用管理员登入系统后,在全功能菜单中打开【基础管理 - 公共设置 - 参数设置】界面,如下图,在分组【基础管理 - 基础平台】功能的界面中启用【客户端启用链式请求】选项,点保存即可启用配置。在客户端用户重新登入云星空系统后,这个参数就会生效。
1.2、编程法:(私有云/公有云/单租户/多租户)
参考后面的【插件实现样例】编写下面逻辑 【Python插件代码】:
from Kingdee.BOS.Core import * from Kingdee.BOS.JSON import * #(Python缩进是4个英文空格) def AfterBindData(e): custarg = JSONObject() ViewUtils.FireClientCustomEvents(this.View, 'SetClientParams', 'Custom.SetClientParams.SeqReqEnabled', 3000, custarg) def CustomEvents(e): if(e.EventName=='Custom.SetClientParams.SeqReqEnabled'): obj = JSONObject() #开启客户端的链式请求 obj["SeqReqEnabled"] = True objs = JSONArray() objs.Add(obj.ToString()) this.View.AddAction("SetClientParams", objs)
1.3、配置法(私有云/单租户):
业务站点 WebSite/App_Data/Common.config 设置 <add key="SeqReqEnabled" value="true" /> 实现所有客户端都为链式请求;(管理站点一般不需要做链式请求);
2、【个别控制】
主控表单增加如下插件实现动态调用链式请求参数,从而实现个别用户独立控制:
【Python插件代码】:
from Kingdee.BOS.Core import * from Kingdee.BOS.JSON import * #(Python缩进是4个英文空格) def AfterBindData(e): #判断为demo用户才开启参数 #这里仅是样例,可以自己定制各种条件,或不做条件限定 #(Python缩进是4个英文空格) # 编程中的个别控制体现在这个判断条件,这里仅是例子针对demo用户启用,可以依据真实需求修改条件:<) if(this.View.Context.UserName=="demo"): custarg = JSONObject() ViewUtils.FireClientCustomEvents(this.View, 'SetClientParams', 'Custom.SetClientParams.SeqReqEnabled', 3000, custarg) def CustomEvents(e): if(e.EventName=='Custom.SetClientParams.SeqReqEnabled'): obj = JSONObject() #开启客户端的链式请求 obj["SeqReqEnabled"] = True objs = JSONArray() objs.Add(obj.ToString()) this.View.AddAction("SetClientParams", objs)
3、【互斥功能】
启用链式请求后,网络重试功能将失效;
4、【校验工具】
启用链式请求后,动态表单服务DynamicFormService的所有Fiddler捕获的请求将不能出现时间交叉,如下图在Fiddler右边切换到Timeline页签,可以看到所有DynamicFormService请求都是按顺序发起结束的;
四、【插件实现样例】
1、在BOSIDE中找到需要挂载二开插件的单据(可以考虑在主控表单上挂启用链式插件),然后再右侧表单列表树中选中并右键扩展该单据(一般原厂单据都需要扩展才能进行二开);
2、主控表单:BOS_MainConsoleSutra,BOS_MainConsoleNewSutra(2021新版),公有云主控表单:97bcb5b2-8dfb-490c-bcfa-9f1021ae8968 (扩展自BOS_MainConsoleSutra);
3、然后注册Python插件,写入如下代码;
五、论坛代码无法直接使用,拷贝进入python插件会报错。可以用Notepad记事本进行替换后,再拷贝入插件窗口即可。
1、扩展原始单据;
2、找到插件,新增python插件;
3、拷贝论坛代码,然后再notepad里面替换掉全角空格为半角英文空格;
4、写入python插件,保存扩展单据;
5、等待元数据生效(一般5分钟,相同域名基本会很快生效);
6、也可通过清理元数据缓存来尽快生效,清理缓存参考:【如何请理元数据缓存】 https://vip.kingdee.com/article/56710272542794753 ;
其他参考文章:
【如何使用Fiddler工具抓取请求saz文件】https://vip.kingdee.com/article/56714444616541696
【启用批量请求,避免网络路由引发请求乱序】 https://vip.kingdee.com/article/13228
... ...
编辑于2021年4月9日 09:03:34
编辑于2021年6月9日 09:30:24
编辑于2021年7月16日 15:24:34
编辑于2021年8月4日 15:38:20