启用链式请求(桌面客户端应用)原创
金蝶云社区-yaojunsong
yaojunsong
29人赞赏了该文章 4,665次浏览 未经作者许可,禁止转载编辑于2021年11月04日 16:00:34
summary-icon摘要由AI智能服务提供

本文介绍了在金蝶云星空系统中,针对网络环境复杂导致HTTP请求乱序的问题,提出了启用链式请求的解决方案。链式请求通过顺序执行每个请求来避免乱序,但可能影响请求性能。文章详细说明了启用链式请求的全局控制和个别控制方法,包括参数设置、编程和配置三种方式,并提供了Python插件代码示例。此外,还提及了启用链式请求后的互斥功能和校验工具使用,以及插件实现样例和注意事项。

本篇基础:BOS平台的二开编程(论坛),C#编程(ms),python语法,VistualStudio2012(up)工具(ms),CS的基础知识


启用链式请求(桌面客户端应用)  PT145060  [7.5.1507.2]  发布时间:2019/12/31


有些客户的网络环境复杂,经过的路由网关较多,操作的请求频率又非常高,从而偶发性的出现非常相近的http(s)请求在网关部分可能引起乱序,针对这种特殊情况,可以考虑启用链式请求来规避这个问题,完整方案如下,请仔细阅读:


一、【乱序现象】:


先请求的连接却被延迟到后面32.351才响应,后请求的被提前31.992响应了,说明网络中的某个网关出现拥挤阻塞引发乱序,如下图:


2.png


二·、【方案说明

      由于金蝶云星空是云服务系统,客户端为更高效的利用资源启用的多任务并发请求。如果习惯用老系统的单任务模式,或者网络环境复杂,可考虑启用“链式请求”功能。

   “链式请求”模式下,每个请求都要等待上个请求响应后才会发起,从而保证每个请求是顺序执行,并且返回指令也是按顺序返回。启用该模式后,请求性能将可能有一定程度下降影响。

   “链式请求”参数一旦启用,当前客户端运行实例的全局所有表单都生效,不是单据独立控制的,因为单据之间存在复杂的业务调用关系,如果局部生效会导致请求次序紊乱,导致业务执行错误。


三、【方案步骤

    注意:逻辑上启用【全局控制】就不需要做【个别控制】了。

  (这里的个别控制是指个别用户控制。注意一旦启用,当前客户端运行实例的全局所有表单都生效


1、【全局控制】以下3种方法可以任意选用一种

1.1、参数设置法:私有云/公有云/单租户/多租户,功能版本:PT-146891 [7.7.0.202109] 7.7.2297.10 ) 

    参考下图,用管理员登入系统后,在全功能菜单中打开【基础管理 - 公共设置 - 参数设置】界面,如下图,在分组基础管理 - 基础平台】功能的界面中启用【客户端启用链式请求】选项,点保存即可启用配置。在客户端用户重新登入云星空系统后,这个参数就会生效。

image.png


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请求都是按顺序发起结束的;

image.png


image.png


四、【插件实现样例

1、在BOSIDE中找到需要挂载二开插件的单据(可以考虑在主控表单上挂启用链式插件),然后再右侧表单列表树中选中并右键扩展该单据(一般原厂单据都需要扩展才能进行二开);

2、主控表单:BOS_MainConsoleSutraBOS_MainConsoleNewSutra(2021新版)公有云主控表单:97bcb5b2-8dfb-490c-bcfa-9f1021ae8968 (扩展自BOS_MainConsoleSutra)

3、然后注册Python插件,写入如下代码;


image.png

 


五、论坛代码无法直接使用,拷贝进入python插件会报错。可以用Notepad记事本进行替换后,再拷贝入插件窗口即可。

 1、扩展原始单据;

 2、找到插件,新增python插件;

 3、拷贝论坛代码,然后再notepad里面替换掉全角空格为半角英文空格; 

 4、写入python插件,保存扩展单据;

 5、等待元数据生效(一般5分钟,相同域名基本会很快生效);

 6、也可通过清理元数据缓存来尽快生效,清理缓存参考:【如何请理元数据缓存】 https://vip.kingdee.com/article/56710272542794753  ;


    image.png



其他参考文章:


如何使用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


图标赞 29
29人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!