具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
参见图1,为本申请实施例的调用数据共享的场景示意图。
图1场景中包括:调用方和被调用方。其中,调用方设备可以是终端设备,也可以是服务器;同理,调用方设备可以是终端设备,也可以是服务器。其中,终端设备可以包括各种智能手机、平板电脑、PC(Personal Computer,个人计算机)等。
一般情况下,调用方可以向被调用方发送调用请求,而被调用方则返回对应的调用结果。
但是,在SOA环境中,由于业务的复杂性和代码实现的必要性,将会出现在一次调用请求中对于某些服务的多次重复调用的情况,因此,本发明实施例在对同一服务的多次调用中,当调用请求对应的调用服务参数一致时,则可以将对应的调用结果进行数据共享,这样可以减少调用方的等待时间和序列化成本,以及减少被调用方的调用量和CPU损耗。
参见图2,为本申请调用数据共享的方法的一个实施例流程图,该方法可以应用在SOA中的调用方设备上,包括:
步骤210:启动与被调用方对应的调用请求。
步骤220:根据调用请求对应的调用服务参数构建共享数据的类对象,所述类对象包括类标识。
本申请实施例中,类标识指定是类对象的唯一关键(key)值,调用服务参数可以为类名、方法或传入参数,并根据该请求参数构建一个基于类名、方法或传入参数的类对象。
其中,Key值是调用远程服务入参构建的key,对应的value值是类名、方法名和传入属性序列化结果。
下面具体说明构建共享数据的类对象的过程,其中,Equals是对象的相等方法,hash code是对象的哈希值方法。
a)构建共享数据唯一KEY值的类,包含类名、方法、传入参数三个属性和equals方法、hashcode方法。保障同一服务的同样参数hashcode和equals相等,不同服务的equals不能相同。
b)Hash code是3倍的类名哈希值、7倍的方法名哈希值和传入参数序列化成字符串哈希值的之和,从而保证了同一方法的同样请求参数哈希值一致。
其中,传入参数序列化规则如下:基本类型、包装类型和字符串(String)都是直接拼接字符串,而复杂类型使用了Apache的Reflection To StringBuilder去转换成String格式。
c)equals方法需要比较类名、方法和传入参数都一致的情况才算相同,其中传入参数列表中涉及复杂对象的比较使用了反射去比较它们是否相同。
d)把调用服务的类名、方法和传入参数构传入类中,构建了一个基于基于类名、方法和传入参数的对象。
步骤230:从主线程的共享数据模型中获取类标识对应的共享数据,当获取到类标识对应的共享数据时,则对类标识对应的共享数据进行相应的数据处理。
由上述实例可见,通过启动与被调用方对应的调用请求,根据调用请求对应的调用服务参数构建共享数据的类对象,所述类对象包括类标识;从主线程的共享数据模型中获取类标识对应的共享数据,当获取到类标识对应的共享数据时,则对类标识对应的共享数据进行相应的数据处理,从而减少了调用方和被调用方的损耗,并减少了调用方的等待时间和序列化成本。
参见图3,为本申请调用数据共享的方法的另一个实施例流程图,该方法可以应用在SOA中的调用方设备上,包括:
步骤300:启动与被调用方对应的调用请求。
步骤310:根据调用请求对应的调用服务参数构建共享数据的类对象,所述类对象包括类标识。其中,类标识指定是类对象的唯一关键(key)值。
步骤320:从主线程的共享数据模型中获取类标识对应的共享数据,当获取到类标识对应的共享数据时,则执行步骤330;当没有获取到类标识对应的共享数据时,则执行步骤340。
步骤330:对类标识对应的共享数据进行相应的数据处理,流程结束。其中,如果主线程的共享数据模型中存储的共享数据出现异常,则反馈异常消息。
步骤340:从锁缓存中获取类标识对应的锁,如果获取到类标识对应的锁,则执行步骤360;如果从锁缓存中没有获取类标识对应的锁,则执行步骤350。
步骤350:构建类标识对应的锁,并将该构建的锁存入锁缓存中。其中,存储时以类标识为key值,锁为对应的value值。一个key值只能映射一个value值,目的是为了同一个类标识能够使用同一个锁。
步骤360:在预设时间内持有类标识对应的锁,当到达预设时间后,再执行步骤370。其中,预设时间的最大值可以为500ms。
另外,设置预设时间是为了防止出现下列情况:在并发的情况下,有些可以共享服务的任务在同时执行,且上一个还没有执行完毕,不能进行共享,因此,这时候最好等待一段时间,减少不必要的远程调用。
步骤370:再次从主线程的共享数据模型中获取类标识对应的共享数据。当获取到类标识对应的共享数据时,则执行步骤380;当没有获取到类标识对应的共享数据时,则执行步骤390。
步骤380:对类标识对应的共享数据进行相应的数据处理,流程结束。其中,如果主线程的共享数据模型中存储的共享数据出现异常,则反馈异常消息。
步骤390:向被调用方发送调用请求,并接收被调用方返回的调用结果,以及将调用结果存入主线程的共享数据模型中。
上述步骤320和步骤370中,从主线程的共享数据模型中获取所述类标识对应的共享数据包括以下两种情况:
(1)当前线程是主线程,则直接从主线程的共享数据模型中获取所述类标识对应的共享数据。
(2)当前线程是子线程,则将对应的主线程绑定到所述当前线程上,并从对应的主线程的共享数据模型中获取所述类标识对应的共享数据。
由上述实例可见,当启动与被调用方对应的调用请求,如果能够在主线程的共享数据模型获取到共享数据时,就不用向被调用方发送调用请求了,只有在主线程的共享数据模型没有获取到共享数据时,再向被调用方发送调用请求,并将被调用方返回的调用结果存入主线程的共享数据模型中,以备于后续调用数据共享,从而减少了调用方和被调用方的损耗,并减少了调用方的等待时间和序列化成本。
与本申请调用数据共享的方法的实施例相对应,本申请还提供了调用数据共享的装置的实施例。
本发明调用数据共享的装置的实施例可以分别应用在终端设备或服务器上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的CPU将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图4所示,为本发明调用数据共享的装置所在设备的一种硬件结构图,除了图4所示的CPU、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的设备通常还可以包括其他硬件,对此图4不再分别示出。
参见图5,为本申请调用数据共享的装置的一个实施例框图,该装置可以应用于SOA中的被调用方设备上,并可以用于执行图2和图3所提供的调用数据共享的方法。该装置包括:启动单元51、构建单元52和第一共享单元53。
其中,启动单元51用于启动与被调用方对应的调用请求。
构建单元52用于根据所述调用请求对应的调用服务参数构建共享数据的类对象,所述类对象包括类标识。
第一共享单元53用于从主线程的共享数据模型中获取所述类标识对应的共享数据,当获取到所述类标识对应的共享数据时,则对所述类标识对应的共享数据进行相应的数据处理。
在一个可选的实现方式中:该装置还包括第一获取单元、第二获取单元和第二共享单元(图5中未示出)。
其中,第一获取单元用于当没有获取到所述类标识对应的共享数据时,则从锁缓存中获取所述类标识对应的锁,并在预设时间内持有所述获取到的锁;
第二获取单元用于再次从主线程的共享数据模型中获取所述类标识对应的共享数据;
第二共享单元用于当获取到所述类标识对应的共享数据时,则对所述类标识对应的共享数据进行相应的数据处理。
其中,第一获取单元还用于当从锁缓存中没有获取到所述类标识对应的锁时,则构建所述类标识对应的锁,并将所述构建的锁存入所述锁缓存中,以及在预设时间内持有所述构建的锁。
在另一个可选的实现方式中:该装置还包括调用单元(图6中未示出)。
其中,调用单元,用于当没有获取到所述类标识对应的共享数据时,则向所述被调用方发送所述调用请求,并接收所述被调用方返回的调用结果,以及将所述调用结果存入所述主线程的共享数据模型中。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本申请实施例还提供了一种调用方设备,该设备包括:
处理器;用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为:
启动与被调用方对应的调用请求;
根据所述调用请求对应的调用服务参数构建共享数据的类对象,所述类对象包括类标识;
从主线程的共享数据模型中获取所述类标识对应的共享数据,当获取到所述类标识对应的共享数据时,则对所述类标识对应的共享数据进行相应的数据处理。
由上述实例可见,当启动与被调用方对应的调用请求,如果能够在主线程的共享数据模型获取到共享数据时,就不用向被调用方发送调用请求了,只有在主线程的共享数据模型没有获取到共享数据时,再向被调用方发送调用请求,并将被调用方返回的调用结果存入主线程的共享数据模型中,以备于后续调用数据共享,从而减少了调用方和被调用方的损耗,并减少了调用方的等待时间和序列化成本。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。