一种优化方法、计算机设备和存储介质转让专利

申请号 : CN201810750601.2

文献号 : CN109240834B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杨亮陈少杰张文明

申请人 : 武汉斗鱼网络科技有限公司

摘要 :

本发明提供了一种优化方法,包括:基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。

权利要求 :

1.一种优化方法,其特征在于,所述方法包括:

基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;

其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;

从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法;

在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数;

在所述升级版的远程过程调用的注册方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:根据所述RpcAttribute属性的关键字的值从所述第一属性数组中获取所述远程过程调用服务名称、所述第一回调函数,所述第一自定义参数和所述参数签名;

调用std::bind函数,将所述第一回调函数和所述第一自定义参数绑定为第一C++函数对象;

根据所述远程过程调用服务名称、所述参数签名和所述第一C++函数对象,调用所述原远程过程调用的注册方法来实现所述升级版的远程过程调用的注册方法;

在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数;

在所述升级版的远程过程调用的调用方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:根据所述RpcAttribute属性的关键字的值从所述第二属性数组中获取所述超时时间、所述第二回调函数和所述第二自定义参数;

从所述升级版的远程过程调用的调用方法的参数列表中获取所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数;

调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象;

根据所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数、所述超时时间和所述第二C++函数对象,调用所述原远程过程调用的调用方法,实现所述升级版的远程过程调用的调用方法。

2.一种优化装置,其特征在于,所述装置包括:

设置单元,用于基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;

实现单元,用于从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法;

在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数;

在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。

3.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;

其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;

从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法;

在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数;

在所述升级版的远程过程调用的注册方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:根据所述RpcAttribute属性的关键字的值从所述第一属性数组中获取所述远程过程调用服务名称、所述第一回调函数,所述第一自定义参数和所述参数签名;

调用std::bind函数,将所述第一回调函数和所述第一自定义参数绑定为第一C++函数对象;

根据所述远程过程调用服务名称、所述参数签名和所述第一C++函数对象,调用所述原远程过程调用的注册方法来实现所述升级版的远程过程调用的注册方法;

在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数;

在所述升级版的远程过程调用的调用方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:根据所述RpcAttribute属性的关键字的值从所述第二属性数组中获取所述超时时间、所述第二回调函数和所述第二自定义参数;

从所述升级版的远程过程调用的调用方法的参数列表中获取所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数;

调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象;

根据所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数、所述超时时间和所述第二C++函数对象,调用所述原远程过程调用的调用方法,实现所述升级版的远程过程调用的调用方法。

4.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;

其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;

从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法;

在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数;

在所述升级版的远程过程调用的注册方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:根据所述RpcAttribute属性的关键字的值从所述第一属性数组中获取所述远程过程调用服务名称、所述第一回调函数,所述第一自定义参数和所述参数签名;

调用std::bind函数,将所述第一回调函数和所述第一自定义参数绑定为第一C++函数对象;

根据所述远程过程调用服务名称、所述参数签名和所述第一C++函数对象,调用所述原远程过程调用的注册方法来实现所述升级版的远程过程调用的注册方法;

在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数;

在所述升级版的远程过程调用的调用方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:根据所述RpcAttribute属性的关键字的值从所述第二属性数组中获取所述超时时间、所述第二回调函数和所述第二自定义参数;

从所述升级版的远程过程调用的调用方法的参数列表中获取所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数;

调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象;

根据所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数、所述超时时间和所述第二C++函数对象,调用所述原远程过程调用的调用方法,实现所述升级版的远程过程调用的调用方法。

说明书 :

一种优化方法、计算机设备和存储介质

技术领域

[0001] 本发明属于计算机技术领域,尤其涉及一种优化方法、计算机设备和存储介质。

背景技术

[0002] 所谓远程过程调用(RPC,Remote Procedure Call),就是一个进程调用另外一个进程所提供的方法,但是在调用端的角度仍然跟调用本进程的函数是一致的。在远程过程调用中,将要提供给被调用端进程的所有参数序列化为一个网络消息,然后通过网络传输发送到被调用端进程中。被调用端处理完成相应的服务后,将产生的结果也序列化成一个网络消息,发送到调用端进程。
[0003] 在远程过程调用实现中,一些远程过程调用方法会用到函数对象,当函数对象为std标准库中的function类型时,由于function为C++模板类,故该函数对象为C++函数对象,然而,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序的崩溃。

发明内容

[0004] 本申请实施例通过提供一种优化方法、计算机设备和存储介质,通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
[0005] 第一方面,本申请通过本申请的一实施例提供如下技术方案:
[0006] 一种优化方法,所述方法包括:
[0007] 基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
[0008] 其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0009] 从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0010] 可选的,在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数。
[0011] 可选的,在所述升级版的远程过程调用的注册方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:
[0012] 根据所述RpcAttribute属性的关键字的值从所述第一属性数组中获取所述远程过程调用服务名称、所述第一回调函数,所述第一自定义参数和所述参数签名;
[0013] 调用std::bind函数,将所述第一回调函数和所述第一自定义参数绑定为第一C++函数对象;
[0014] 根据所述远程过程调用服务名称、所述参数签名和所述第一C++函数对象,调用所述原远程过程调用的注册方法来实现所述升级版的远程过程调用的注册方法。
[0015] 可选的,在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。
[0016] 可选的,在所述升级版的远程过程调用的调用方法中,所述从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法,包括:
[0017] 根据所述RpcAttribute属性的关键字的值从所述第二属性数组中获取所述所述超时时间、所述第二回调函数和所述第二自定义参数;
[0018] 从所述升级版的远程过程调用的调用方法的参数列表中获取所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数;
[0019] 调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象;
[0020] 根据所述要发送的远端程序、所述远程过程调用服务名称、所述远程过程调用的参数、所述参数个数、所述超时时间和所述第二C++函数对象,调用所述原远程过程调用的调用方法,实现所述升级版的远程过程调用的调用方法。
[0021] 第二方面,本申请通过本申请的一实施例提供如下技术方案:
[0022] 一种优化装置,所述装置包括:
[0023] 设置单元,用于基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0024] 实现单元,用于从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0025] 可选的,在所述升级版的远程过程调用的注册方法中,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数,所述第一回调函数的参数包括远程过程调用服务的远端标识、远程过程调用的参数、参数个数、远程过程调用服务执行的上下文环境和所述第一自定义参数。
[0026] 可选的,在所述升级版的远程过程调用的调用方法中,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二回调函数的参数包括所述远程过程调用的参数和所述第二自定义参数。
[0027] 第三方面,本申请通过本申请的一实施例提供如下技术方案:
[0028] 一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
[0029] 基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
[0030] 其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0031] 从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0032] 第四方面,本申请通过本申请的一实施例提供如下技术方案:
[0033] 一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
[0034] 基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
[0035] 其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0036] 从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0037] 可见,本申请通过基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。可以通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。

附图说明

[0038] 图1为本申请实施例中提供的优化方法的流程图;
[0039] 图2为本申请实施例中提供的优化装置的结构示意图;
[0040] 图3为本申请实施例中提供的计算机可读存储介质的结构示意图;
[0041] 图4为本申请实施例中提供的计算机设备的结构示意图。

具体实施方式

[0042] 本申请实施例提供了一种优化方法、计算机设备和存储介质,可以通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
[0043] 本申请实施例的技术方案为解决上述技术问题,总体思路如下:
[0044] 基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0045] 为了更好的理解上述技术方案,以下结合附图以及具体实施例,对上述技术方案进行进一步详细说明。应当理解,本申请实施例使用的函数名称或变量名称等,并不用于限定本申请,在一些其他可能的实现方式中,也可以使用其他命名方式。
[0046] 实施例一:
[0047] 请参阅图1,本实施例提供的一种优化方法包括以下步骤:
[0048] S101、基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数。
[0049] 在远程过程调用的实现中,有两个重要的远程过程调用方法函数,一个是远程过程调用的注册方法RpcRegisterProcedure,用来注册RPC服务,另一个是远程过程调用的调用方法RpcCallProcedure,用来调用RPC服务,为了方便与升级版的远程过程调用方法进行区分,下面将远程过程调用的注册方法RpcRegisterProcedure称为原远程过程调用的注册方法,远程过程调用的调用方法RpcCallProcedure称为原远程过程调用的调用方法。
[0050] 一方面,原远程过程调用的注册方法RpcRegisterProcedure的函数原型如下:
[0051] bool RpcRegisterProcedure(HRPC  rpc,const  char*name,const RpcAsyncProcedure&procedure,const char*signature);
[0052] 其中参数rpc表示远程过程调用实例句柄,name表示远程过程调用服务名称,procedure表示函数对象,signature表示该函数对象所需要的参数签名,参数签名用来校验调用端传递过来的参数是否符合该函数对象所需要的参数。可见,远程过程调用的注册方法RpcRegisterProcedure包括函数对象
[0053] RpcAsyncProcedure,该函数对象的类型定义如下:
[0054] typedef std::functionRpcAsyncProcedure
[0055] 可见,RpcAsyncProcedure是一个接受4参数的std::function函数对象,由于std::function为C++模板类型,所以RpcAsyncProcedure函数对象为C++函数对象,第一个参数caller表示调用该远程过程调用服务的远端标识,args表示RPC调用的参数,numArgs表示参数个数,asyncContext参数表示远程过程调用服务执行的上下文环境。
[0056] 另一方面,原远程过程调用的调用方法RpcCallProcedure的函数原型如下:
[0057] IRpcArgumentArray*RpcCallProcedure(HRPC rpc,void*session,const char*name,IRpcArgument**args,int numargs,const RpcCompleteRoutine async,uint32_ttimedOut);
[0058] 其中rpc表示远程过程调用实例句柄,session表示要将给远程过程调用请求发送的远端程序,name表示要调用的远程过程调用服务名称,args表示本次调用的参数,numargs表示args参数个数,async不等于0的时候,表示本次调用是一个RPC异步调用,调用完成后的结果是通过async这个回调函数对象进行传递的,而不是通过该函数的返回值传递的;而如果async等于0,则表示本次调用是一个RPC同步调用,调用完成后的结果是通过该函数的返回值传递的,timeOut参数用来设置本次RPC调用的超时时间,RpcCompleteRoutine为函数对象,该函数对象的类型定义如下:
[0059] typedef std::functionRpcCompleteRoutine[0060] 可见,该函数对象是一个接受一个参数的std::function函数对象,该唯一的参数表示RPC异步调用后的结果,由于std::function为C++模板类型,所以RpcCompleteRoutine函数对象为C++函数对象。
[0061] 基于此,本实施例中基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法RpcRegisterProcedure设置升级版的远程过程调用的注册方法RpcRegisterProcedureEx和基于原远程过程调用的调用方法RpcCallProcedure设置升级版的远程过程调用的调用方法RpcCallProcedureEx。
[0062] 下面将分别描述两种升级版的远程过程调用方法的具体结构:
[0063] (1)升级版的远程过程调用的注册方法RpcRegisterProcedureEx:
[0064] 升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组。
[0065] 举个例子,升级版的远程过程调用的注册方法的函数原型如下:
[0066] bool RpcRegisterProcedureEx(HRPC rpc,int64_t*attr);
[0067] 该函数只接收两个参数,一个是远程过程调用实例句柄rpc,另外是一个int64类型的第一属性数组attr,所述第一属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第一回调函数、远程过程调用服务名称、参数签名和第一自定义参数。其中,在原远程过程调用的注册方法中,参数签名用来校验调用端传递过来的参数是否符合函数对象所需要的参数,函数对象所需要的参数包括远程过程调用服务的远端标识,远程过程调用的参数,参数个数,远程过程调用服务执行的上下文环境。类似的,在升级版的远程过程调用的注册方法中,参数签名用来校验调用端传递过来的参数是否符合第一回调函数所需要的参数,第一回调函数所需要的参数包括远程过程调用服务的远端标识,远程过程调用的参数,参数个数,远程过程调用服务执行的上下文环境。另外,所述第一属性数组以RPC_ATTR_END属性结尾。
[0068] 应当理解,第一回调函数是以C语言的函数指针方式设置的,举个例子,第一回调函数的类型定义如下:
[0069] typedef void(*RPC_CALLBACK_FUNCTION)(void*caller,IRpcArgument**args,int numArgs,AsyncRpcProcedureContext asyncContext,void*userData)
[0070] 可见,第一回调函数的参数包括远程过程调用服务的远端标识caller、远程过程调用的参数args、参数个数numArgs、远程过程调用服务执行的上下文环境AsyncRpcProcedureContext和第一自定义参数userData,其中第一自定义参数用来存储上层使用时的自定义参数,所述第一自定义参数按照以RpcAttribute属性为关键字的键值对的方式存储在所述第一属性数组中,远程过程调用的参数args表示本次调用任务需要用到的参数,相应的,参数个数numArgs表示该远程过程调用的参数的个数。
[0071] (2)升级版的远程过程调用的调用方法RpcCallProcedureEx:
[0072] 升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组。
[0073] 举个例子,升级版的远程过程调用的调用方法的函数原型如下:
[0074] IRpcArgumentArray*RpcCallProcedureEx(HRPC rpc,void*session,const char*name,IRpcArgument**args,int numArgs,int64_t*attr);
[0075] 该函数接收参数6个参数,包括远程过程调用实例句柄rpc、要发送的远端程序session、远程过程调用服务名称name、远程过程调用的参数args、参数个数numArgs和int64类型的第二属性数组attr,所述第二属性数组用于按照以所述RpcAttribute属性为关键字的键值对的方式存储第二回调函数、超时时间和第二自定义参数,所述第二属性数组以RPC_ATTR_END属性结尾。
[0076] 应当理解,第二回调函数是以C语言的函数指针方式设置的,举个例子,第二回调函数的类型定义如下:
[0077] typedef void(*RPC_COMPLETE_ROUTINE)(IRpcArgumentArray*,void*userData);
[0078] 可见,第二回调函数的参数包括远程过程调用的参数IRpcArgumentArray*和第二自定义参数userData,其中第二自定义参数用来存储上层使用时的自定义参数,所述第二自定义参数按照以所述RpcAttribute属性为关键字的键值对的方式存储在所述第二属性数组中。
[0079] S102、从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0080] 举个例子,本实施例中RpcAttribute属性主要包括:
[0081] (1)RPC_ATTR_CALLBACK_FUNCTION
[0082] 该属性关键字用来设定RpcRegisterProcedureEx或者RpcCallProcedureEx函数中相关的回调函数,即本实施例中的第一回调函数和第二回调函数,当在RpcRegisterProcedureEx函数中使用该属性时,表示用来注册RPC服务函数,当在RpcCallProcedureEx函数中使用该属性时,表示用来设定异步调用RPC服务。
[0083] (2)RPC_ATTR_CALLBACK_USERDATA
[0084] 该属性关键字用来设定上述自定义参数void*userData的值,即本实例中的第一自定义参数和第二自定义参数。
[0085] (3)RPC_ATTR_FUNCTION_SIGNATURE
[0086] 该属性关键字用来设定原RpcRegisterProcedure函数的第四个参数signature,即参数签名的值。
[0087] (4)RPC_ATTR_FUNCTION_NAME
[0088] 该属性关键字用来设定原RpcRegisterProcedure函数的第二个参数RPC服务的名称name的值。
[0089] (5)RPC_ATTR_TIMEOUT_VALUE
[0090] 该属性关键字用来设定原RpcCallProcedure函数中用来设置timeOut超时时间的值,如果在调用RpcCallProcedureEx的时候,没有设定该值,则默认的时间是INFINITE即无限超时时间。
[0091] (6)RPC_ATTR_ASYNC_CALL
[0092] 该属性关键字用来显示的设定是否采用异步的方式去调用RPC服务。当将该属性值设定为1时,即使没有指定RPC_ATTR_CALLBACK_FUNCTION的值,在调用RpcCallProcedureEx时,也会采用异步的方式去调用RPC;如果将该属性设定为0,则显示的指明以同步的方式去调用RPC;此时即使指定了RPC_ATTR_CALLBACK_FUNCTION的值,将会被忽略。该属性的默认值为0。
[0093] (7)RPC_ATTR_JUST_NOTIFY
[0094] 该属性关键字用来设定是否采用RPC通知的方式去调用RPC服务。如果将该属性的值设置为1,那么将采用RPC通知的方式去调用RPC服务,RPC通知表示调用端不需要本次调用的结果,RPC被调用端也不需要将结果反馈给调用端;如果将该值设置为0,则采用RPC请求的方式去调用RPC服务,此时调用端需要本次调用的结果,RPC被调用端也需要将结果反馈给调用方。该属性的默认值为0。
[0095] 下面将分别描述两种升级版的远程过程调用方法的具体实现:
[0096] (1)升级版的远程过程调用的注册方法RpcRegisterProcedureEx:
[0097] 在升级版的远程过程调用的注册方法中,从通过RpcAttribute属性方式设置的参数中获取需要的参数并调用原远程过程调用的注册方法来实现升级版的远程过程调用的注册方法,包括:
[0098] a.根据RpcAttribute属性的关键字的值从第一属性数组中获取所述远程过程调用服务名称、第一回调函数,第一自定义参数和参数签名。
[0099] 从attr属性数组中获取关键字等于RPC_ATTR_FUNCTION_NAME的值,标记为rpcName,从而获取远程过程调用服务名称。
[0100] 从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_FUNCTION的值,标记为rpcFunction,从而获取第一回调函数。
[0101] 从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_USERDATA的值,标记为userData,从而获取第一自定义参数。
[0102] 从attr属性数组中获取关键字等于RPC_ATTR_FUNCTION_SIGNATURE的值,标记为signature,从而获取参数签名。
[0103] b.调用std::bind函数,将所述第一回调函数rpcFunction和所述第一自定义参数userData绑定为第一C++函数对象,具体的:
[0104] rpcFunctionObj=std::bind(rpcFunction,userData);
[0105] c.根据远程过程调用服务名称、参数签名和第一C++函数对象,调用原远程过程调用的注册方法来实现升级版的远程过程调用的注册方法,具体的:
[0106] RpcRegisterProcedure(rpc,rpcName,rpcFunctionObj,signature)。
[0107] (2)升级版的远程过程调用的调用方法RpcCallProcedureEx:
[0108] 在升级版的远程过程调用的调用方法中,从通过RpcAttribute属性方式设置的参数中获取需要的参数并调用原远程过程调用的调用方法来实现升级版的远程过程调用的调用方法,包括:
[0109] a.根据RpcAttribute属性的关键字的值从第二属性数组中获取超时时间、第二回调函数和第二自定义参数,并从RpcCallProcedureEx的参数列表中获取远程过程调用服务名称、要发送的远端程序、远程过程调用的参数和参数个数。
[0110] 从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_FUNCTION的值,标记为rpcFunction,从而获取第二回调函数。
[0111] 从attr属性数组中获取关键字等于RPC_ATTR_CALLBACK_USERDATA的值,标记为userData,从而获取第二自定义参数。
[0112] 从attr属性数组中获取关键字等于RPC_ATTR_TIMEOUT_VALUE的值,标记为timeout,从而获取超时时间。
[0113] b.调用std::bind函数,将所述第二回调函数和所述第二自定义参数绑定为第二C++函数对象,具体的:
[0114] rpcFunctionObj=std::bind(rpcFunction,userData);
[0115] c.根据要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数、超时时间和第二C++函数对象,调用原远程过程调用的调用方法,实现升级版的远程过程调用的调用方法,具体的:
[0116] RpcCallProcedure(rpc,session,rpcName,args,numargs,rpcFunctionObj,timedOut)
[0117] 本实施例中,基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。可以通过改用C语言的函数指针方式设置回调函数来优化RPC方法,解决了现有技术中,由于不同版本的编译器对C++函数对象的内存布局大小可能不一致,从而可能导致程序崩溃的问题。
[0118] 基于同一发明构思,本申请提供了一种优化装置,详见图2,下面将结合图2对实施例二进行介绍。
[0119] 实施例二:
[0120] 请参阅图2,本实施例提供的优化装置包括:
[0121] 设置单元201,用于基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0122] 实现单元202,用于从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0123] 本申请实施例二提供的优化装置及本申请实施例一提供的优化方法属于同一构思,其具体实现过程详见说明书全文,此处不再赘述。
[0124] 基于同一发明构思,本申请提供了一种计算机可读存储介质,详见图3,下面将结合图3对实施例三进行介绍。
[0125] 实施例三:
[0126] 本实施例提供了一种计算机可读存储介质300,所述计算机可读存储介质300存储有计算机程序311,所述计算机程序311被处理器执行时实现以下步骤:
[0127] 基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
[0128] 其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0129] 从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0130] 在具体实施过程中,该计算机程序311被处理器执行时,可以实现实施例一中任一实施方式。
[0131] 基于同一发明构思,本申请还提供了一种计算机设备,详见图4,下面将结合图4对实施例四进行介绍。
[0132] 实施例四:
[0133] 本申请提供了一种计算机设备400,包括处理器420、存储器410以及存储在存储器410上并可在处理器420上运行的计算机程序411,所述处理器420执行所述计算机程序411时实现以下步骤:
[0134] 基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法,在所述升级版的远程过程调用方法中,改用C语言的函数指针方式设置回调函数,并通过RpcAttribute属性方式设置参数;
[0135] 其中,所述基于包括C++函数对象的原远程过程调用方法设置升级版的远程过程调用方法包括:基于原远程过程调用的注册方法设置升级版的远程过程调用的注册方法和基于原远程过程调用的调用方法设置升级版的远程过程调用的调用方法,所述升级版的远程过程调用的注册方法的参数包括远程过程调用实例句柄和int64类型的第一属性数组,所述升级版的远程过程调用的调用方法的参数包括远程过程调用实例句柄、要发送的远端程序、远程过程调用服务名称、远程过程调用的参数、参数个数和int64类型的第二属性数组,所述第一属性数组和所述第二属性数组以RPC_ATTR_END属性结尾;
[0136] 从所述通过RpcAttribute属性方式设置的参数中获取需要的参数并调用所述原远程过程调用方法来实现所述升级版的远程过程调用方法。
[0137] 由于本实施例所介绍的计算机设备400为实施本申请实施例一中优化方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备400的具体实施方式以及其各种变化形式,所以在此对于该计算机设备400如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
[0138] 本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0139] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0140] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0141] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0142] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0143] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0144] 以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。