消息处理方法和装置与流程

文档序号:18597864发布日期:2019-09-03 22:16阅读:194来源:国知局
消息处理方法和装置与流程

本申请涉及通信技术领域,尤其是涉及一种消息处理方法和装置。



背景技术:

对于设备内部的多个功能模块来说,这些功能模块之间需要交互业务消息,即发送端向接收端发送业务消息。例如,发送端(如应用模块)获取日志消息,并将日志消息发送给接收端(如日志模块),由接收端根据日志消息进行处理。

发送端在向接收端发送日志消息时,采用非阻塞方式(dontwait)发送日志消息,也就是说,发送端向接收端发送日志消息1后,不需要等待接收端的响应,发送端可以继续向接收端发送日志消息2,以此类推。

为了避免发送端向接收端发送大量日志消息,导致接收端无法及时处理这些日志消息,还需要对发送端的消息总长度阈值、接收端的消息总数量阈值进行限制,例如,消息总长度阈值为a,消息总数量阈值为b。

基于此,当发送端需要发送日志消息时,若该日志消息的长度(如长度1)与当前消息长度(如长度2)之和大于消息总长度阈值a,则发送端不能成功将该日志消息发送给接收端,即该日志消息发送失败。若长度1与长度2之和不大于消息总长度阈值a,则发送端能够成功将该日志消息发送给接收端,并将当前消息长度更新为长度1与长度2之和。

当发送端需要发送日志消息时,若接收端的接收队列中已经存储的日志消息数量达到消息总数量阈值b,则发送端不能成功将该日志消息发送给接收端,即日志消息发送失败。若接收端的接收队列中已经存储的日志消息数量未达到消息总数量阈值b,则发送端能够成功将该日志消息发送给接收端。

综上所述,由于消息总长度阈值a和消息总数量阈值b的限制,发送端可能无法将日志消息发送给接收端,从而导致日志消息的发送失败。



技术实现要素:

有鉴于此,本申请提供一种消息处理方法和装置,避免业务消息发送失败。

第一方面,本申请提供一种消息处理方法,应用于接收端,所述接收端包括多个服务套接字socket组件,每个服务socket组件对应一个接收队列,包括:

通过目标服务socket组件与发送端包括的目标客户socket组件建立通信连接;其中,所述目标服务socket组件是所述多个服务socket组件中的任意一个,所述目标客户socket组件是所述发送端包括的至少一个客户socket组件中的任意一个;

将所述发送端通过所述通信连接发送的业务消息,存储到所述目标服务socket组件对应的接收队列。

第二方面,本申请提供一种消息处理装置,应用于接收端,所述接收端包括多个服务套接字socket组件,每个服务socket组件对应一个接收队列,包括:

建立模块,用于通过目标服务socket组件与发送端包括的目标客户socket组件建立通信连接;其中,所述目标服务socket组件是所述多个服务socket组件中的任意一个,所述目标客户socket组件是所述发送端包括的至少一个客户socket组件中的任意一个;

存储模块,用于将所述发送端通过所述通信连接发送的业务消息,存储到所述目标服务socket组件对应的接收队列。

由以上技术方案可见,本申请中,在接收端部署多个服务套接字(socket)组件,每个服务socket组件的限制条件为消息总数量阈值,假设服务socket组件的数量为n,则接收端能够存储消息总数量阈值*n个业务消息,从而增加接收端存储的业务消息数量,避免业务消息发送失败。在发送端部署多个客户socket组件,每个客户socket组件的限制条件为消息总长度阈值,假设客户socket组件的数量为m,则发送端能够发送的业务消息长度为消息总长度阈值*m,从而增加发送端发送的业务消息长度,避免业务消息发送失败。

综上所述,在非阻塞方式的场景下,即使发送端需要发送大量的业务消息,也能够避免业务消息的发送失败,即业务消息不会发生丢失。

附图说明

为了更加清楚地说明本申请实施例或者现有技术中的技术方案,下面将对本申请实施例或者现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据本申请实施例的这些附图获得其他的附图。

图1a和图1b是本申请一种实施方式中的应用场景示意图;

图2a-图2g是本申请一种实施方式中的业务消息处理的示意图;

图3a和图3b是本申请一种实施方式中的多个服务socket组件的示意图;

图4是本申请一种实施方式中的消息处理方法的流程图;

图5是本申请一种实施方式中的socket组件连接的示意图;

图6是本申请一种实施方式中的存储的业务消息顺序示意图;

图7是本申请一种实施方式中的消息处理方法的流程图;

图8a-图8e是本申请一种实施方式中的数据结构的示意图;

图9a-图9f是本申请一种实施方式中的数据结构的变化示意图;

图10是本申请一种实施方式中的消息处理装置的结构图;

图11是本申请一种实施方式中的服务端的硬件结构图。

具体实施方式

在本申请实施例使用的术语仅仅是出于描述特定实施例的目的,而非限制本申请实施例。本申请实施例和权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。本文中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,此外,所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

本申请实施例中提出一种消息处理方法,该方法可以应用于包括发送端(即客户端)和接收端(即服务端)的电子设备,该电子设备可以是路由器、交换机、服务器或者个人计算机等,对此不做限制。其中,发送端和接收端均可以是电子设备内部的功能模块,且发送端需要向接收端发送业务消息。例如,发送端可以是应用模块,接收端可以是日志模块,应用模块用于获取日志消息,并将该日志消息发送给日志模块,由日志模块根据该日志消息进行处理。

在一个例子中,发送端和接收端可以部署在容器。例如,发送端和接收端部署在相同的容器;或者,发送端和接收端部署在不同的容器。当然,发送端和接收端也可以未部署在容器,只是作为电子设备内部的功能模块。

参见图1a和图1b所示,为本申请实施例的应用场景示意图,以发送端11、发送端12和接收端13均部署在容器为例。参见图1a所示,发送端11、发送端12和接收端13,是部署在不同的容器;参见图1b所示,发送端11、发送端12和接收端13,是部署在相同的容器。在图1a和图1b中,是以2个发送端为例进行说明,在实际应用中,发送端的数量还可以更多,对此不做限制。

可选地,在一个例子中,发送端11包括socket组件111(为了区分方便,将socket组件111称为主客户socket组件),发送端12包括socket组件121(为了区分方便,将socket组件121称为主客户socket组件),接收端13包括socket组件131(为了区分方便,将socket组件131称为主服务socket组件)。

发送端11通过socket组件111与接收端13的socket组件131建立通信连接,发送端11通过该通信连接将业务消息发送给接收端13,接收端13将业务消息存储到socket组件131的接收队列。发送端12通过socket组件121与接收端13的socket组件131建立通信连接,发送端12通过该通信连接将业务消息发送给接收端13,接收端13将业务消息存储到socket组件131的接收队列。

在发送端11将业务消息发送给接收端13时,可以采用非阻塞方式发送业务消息,也就是说,发送端11每次向接收端13发送业务消息后,不需要等待接收端13的响应,可以继续向接收端13发送下一个业务消息。同理,在发送端12将业务消息发送给接收端13时,可以采用非阻塞方式发送业务消息。

显然,若发送端11和发送端12短时间内向接收端13发送大量的业务消息,则接收端13可能无法及时处理这些业务消息,导致业务消息堆积。为了避免上述情况发生,则可以对发送端11的消息总长度阈值、发送端12的消息总长度阈值、接收端13的消息总数量阈值进行限制,如发送端11的消息总长度阈值为500,发送端12的消息总长度阈值为600,接收端13的消息总数量阈值为3。

其中,消息总长度阈值可以是指:发送端发送的、尚未被接收端调用的消息长度上限值。例如,发送端11的消息总长度阈值为500,其表示发送端11发送的、仍然存储在socket组件131的接收队列中的消息总长度不能超过500。

其中,消息总数量阈值可以是指:接收端的接收队列中、尚未被接收端调用的消息数量上限值。例如,接收端13的消息总数量阈值为3,其表示在接收端13的socket组件131的接收队列中,存储的业务消息数量不能超过3个。

参见图2a所示,发送端11通过socket组件111与socket组件131建立通信连接,发送端12通过socket组件121与socket组件131建立通信连接,socket组件131对应接收队列c1,接收队列c1的队列深度为3,队列深度3表示socket组件131的消息总数量阈值为3,即限制接收队列中的消息数量不能超过3个。

参见图2b所示,发送端11通过socket组件111向接收端13发送一个100字节的业务消息a1,并将socket组件111的缓冲存(buffer)更新为100,表示发送端11已经在socket组件131对应的接收队列c1中,存储了100字节的业务消息。发送端12通过socket组件121向接收端13发送一个200字节的业务消息b1,并将socket组件121的buffer更新为200,表示发送端12已经在socket组件131对应的接收队列c1中,存储了200字节的业务消息。

参见图2c所示,接收端13在接收到业务消息a1后,将业务消息a1存储到socket组件131对应的接收队列c1中。接收端13在接收到业务消息b1后,将业务消息b1存储到socket组件131对应的接收队列c1中。

参见图2d所示,假设发送端11的消息总长度阈值为500,发送端11需要向接收端13发送一个500字节的业务消息a2时,由于业务消息a2的长度(500)与buffer中记录的当前消息长度(100)之和大于消息总长度阈值500,因此,发送端11不能将业务消息a2发送给接收端13,即业务消息a2发送失败。

参见图2e所示,假设发送端11需要向接收端13发送300字节的业务消息a3,由于业务消息a3的长度(300)与buffer中记录的当前消息长度100之和小于消息总长度阈值500,因此,发送端11能够将业务消息a3发送给接收端13,并将buffer更新为400(即业务消息a3的长度与当前消息长度之和)。接收端13接收到业务消息a3后,将业务消息a3存储到接收队列c1。

参见图2f所示,假设发送端12的消息总长度阈值为600,接收队列c1的队列深度为3(即接收队列c1的消息总数量阈值为3),发送端12需要向接收端13发送一个100字节的业务消息b2时,虽然业务消息b2的长度(100)与buffer中记录的当前消息长度(200)之和小于消息总长度阈值600,但是,由于接收队列c1中已经存储了3个业务消息,即已经达到了消息总数量阈值,因此,发送端12不能将业务消息b2发送给接收端13,即业务消息b2发送失败。

参见图2g所示,假设接收端13调用接收队列c1中的业务消息a1,将业务消息a1输出给上层业务模块进行处理,则发送端11将buffer更新为300(即当前消息长度与业务消息a1的长度之差),且接收队列c1存储2个业务消息。

综上所述,由于消息总长度阈值和消息总数量阈值的限制,业务消息可能发送失败。在一个可能的实现方式中,可以修改消息总长度阈值和消息总数量阈值的限制,例如,将消息总长度阈值的限制从500字节修改为5000字节,将消息总数量阈值的限制从3个修改为10个,从而避免业务消息发送失败。

但是,当发送端和接收端部署在容器时,没有权限修改系统配置,即不能修改消息总长度阈值和消息总数量阈值的限制,从而导致业务消息发送失败。

针对上述发现,本申请实施例中,接收端13可以包括多个服务socket组件,每个服务socket组件对应一个接收队列。所述多个服务socket组件包括一个主服务socket组件和至少一个从服务socket组件。参见图3a所示,以接收端13包括一个从服务socket组件为例,在实际应用中,从服务socket组件的数量可以更多,对此不做限制。在图3a中,socket组件131为主服务socket组件,且接收队列c1为主服务socket组件对应的接收队列,socket组件132为从服务socket组件,且接收队列c2为从服务socket组件对应的接收队列。

其中,主服务socket组件对应一个socket组件地址(为了区分方便,将该socket组件地址称为主地址),即主服务socket组件与主地址绑定。进一步的,可以利用地址映射策略将主地址映射为至少一个新socket组件地址(为了区分方便,将映射的新socket组件地址称为从地址),从地址的数量与从服务socket组件的数量相同,也就是说,至少一个从服务socket组件中的每个从服务socket组件与一个从地址绑定,即不同的从服务socket组件对应不同的从地址。

其中,地址映射策略可以根据经验配置,对此地址映射策略不做限制,只要能够基于主地址确定从地址即可。例如,地址映射策略为主地址+特定后缀,当然,上述只是地址映射策略的示例。假设地址映射策略为主地址+特定后缀,那么,从地址包括主地址以及预设后缀,每个从地址包括的预设后缀均不同。

例如,主服务socket组件对应的主地址为/myipc,则从地址可以为/myipc.1、/myipc.2、…,以此类推。这样,第一个从服务socket组件对应的从地址是/myipc.1,第二个从服务socket组件对应的从地址是/myipc.2,…,以此类推。

综上所述,通过在接收端13部署多个服务socket组件,每个服务socket组件的限制条件为消息总数量阈值,这样,假设服务socket组件的数量为n,则接收端13能够存储消息总数量阈值*n个业务消息,从而增加接收端13存储的业务消息数量,避免业务消息的发送失败。例如,当消息总数量阈值的限制为3时,若接收端13包括5个服务socket组件,则这5个服务socket组件对应5个接收队列,每个接收队列最多能够存储3个业务消息,这样,接收端13一共可以存储15个业务消息,从而增加存储的业务消息数量。

本申请实施例中,发送端11包括至少一个客户socket组件。例如,所述至少一个客户socket组件只包括一个客户socket组件,该客户socket组件为主客户socket组件,参见图3a所示,socket组件111为主客户socket组件。又例如,所述至少一个客户socket组件包括一个主客户socket组件和至少一个从客户socket组件。参见图3b所示,以发送端11包括一个从客户socket组件为例,实际应用中,从客户socket组件的数量可以更多,对此不做限制。在图3b中,socket组件111为主客户socket组件,socket组件112为从客户socket组件。

其中,当发送端11的主客户socket组件发送业务消息失败时,则发送端11可以新建一个从客户socket组件,由于独自限制每个客户socket组件的消息总长度阈值,因此,在建立从客户socket组件后,能够通过从客户socket组件将业务消息发送给接收端13,使得业务消息的发送成功。当从客户socket组件发送业务消息失败时,发送端11可以新建一个从客户socket组件,通过这个新建的从客户socket组件将业务消息发送给接收端13,以此类推。

综上所述,通过在发送端11部署多个客户socket组件,每个客户socket组件的限制条件为消息总长度阈值,这样,假设客户socket组件的数量为m,则发送端11能够发送的业务消息长度为消息总长度阈值*m,从而增加发送端11发送的业务消息长度,避免业务消息的发送失败。例如,当消息总长度阈值为500字节时,若发送端11包括5个客户socket组件,则每个客户socket组件能够发送500字节的业务消息,也就是说,5个客户socket组件最多能够发送2500字节的业务消息,从而增加发送端11发送的业务消息长度。

基于上述应用场景,如图4所示,为消息处理方法的流程图,该方法包括:

步骤401,接收端通过目标服务socket组件与发送端的目标客户socket组件建立通信连接;其中,目标服务socket组件是多个服务socket组件中的任意一个,目标客户socket组件是至少一个客户socket组件中的任意一个。

例如,参见图3a所示,目标服务socket组件为主服务socket组件或者从服务socket组件,目标客户socket组件为主客户socket组件。又例如,参见图3b所示,目标服务socket组件为主服务socket组件或者从服务socket组件,目标客户socket组件为主客户socket组件或者从客户socket组件。

步骤402,接收端将发送端通过该通信连接发送的业务消息,存储到目标服务socket组件对应的接收队列。例如,接收端可以通过该通信连接接收发送端发送的业务消息,将该业务消息存储到目标服务socket组件对应的接收队列。

具体的,当在目标服务socket组件与目标客户socket组件之间建立通信连接后,发送端的目标客户socket组件可以通过该通信连接向目标服务socket组件发送业务消息,而接收端的目标服务socket组件可以通过该通信连接接收该业务消息。然后,接收端的目标服务socket组件通过该通信连接接收到该业务消息后,可以将该业务消息存储到该目标服务socket组件对应的接收队列。

由以上技术方案可见,本申请实施例中,在接收端部署多个服务socket组件,每个服务socket组件的限制条件为消息总数量阈值,假设服务socket组件的数量为n,则接收端能够存储消息总数量阈值*n个业务消息,从而增加接收端存储的业务消息数量,避免业务消息发送失败。在发送端部署多个客户socket组件,每个客户socket组件的限制条件为消息总长度阈值,假设客户socket组件的数量为m,则发送端能够发送的业务消息长度为消息总长度阈值*m,从而增加发送端发送的业务消息长度,避免业务消息发送失败。综上所述,即使发送端需要发送大量业务消息,也能够避免业务消息的发送失败。

可选地,在一个例子中,若目标服务socket组件为主服务socket组件,目标客户socket组件为主客户socket组件,参见图3a或图3b所示,则目标服务socket组件为socket组件131,目标客户socket组件为socket组件111,因此,发送端11和接收端13可以在socket组件111与socket组件131之间建立通信连接。基于所述通信连接,发送端11通过socket组件111向接收端13的socket组件131发送业务消息,接收端13通过socket组件131接收该业务消息,在接收到业务消息后,将该业务消息存储到socket组件131对应的接收队列c1。

若目标服务socket组件为从服务socket组件,目标客户socket组件为主客户socket组件,参见图3a或者图3b所示,则目标服务socket组件为socket组件132,目标客户socket组件为socket组件111,因此,在socket组件111与socket组件132之间建立通信连接。基于所述通信连接,发送端11通过socket组件111向socket组件132发送业务消息,接收端13通过socket组件132接收业务消息,将该业务消息存储到socket组件132对应的接收队列c2。

此外,若目标服务socket组件为主服务socket组件,目标客户socket组件为从客户socket组件,参见图3b所示,则目标服务socket组件为socket组件131,目标客户socket组件为socket组件112,因此,在socket组件112与socket组件131之间建立通信连接。基于所述通信连接,发送端11通过socket组件112向socket组件131发送业务消息,接收端13通过socket组件131接收业务消息,并将该业务消息存储到socket组件131对应的接收队列c1。

此外,若目标服务socket组件为从服务socket组件,目标客户socket组件为从客户socket组件,参见图3b所示,则目标服务socket组件为socket组件132,目标客户socket组件为socket组件112,因此,在socket组件112与socket组件132之间建立通信连接。基于所述通信连接,发送端11通过socket组件112向socket组件132发送业务消息,接收端13通过socket组件132接收业务消息,将该业务消息存储到socket组件132对应的接收队列c2。

可选地,在一个例子中,接收端包括多个服务socket组件,发送端包括多个客户socket组件时,客户socket组件与服务socket组件的连接方式可以参见图5所示。发送端的从客户socket组件可以连接接收端的任意从服务socket组件。发送端的主客户socket组件可以连接接收端的主服务socket组件。此外,发送端的主客户socket组件不会发生变化,发送端的从客户socket组件不会长久维护,如果从客户socket组件发送业务消息失败,则可以关闭这个从客户socket组件,重新建立一个新的从客户socket组件继续发送业务消息。

例如,在正常情况下,发送端使用主客户socket组件与接收端的主服务socket组件通信。当主客户socket组件发送业务消息失败时,发送端建立一个新的从客户socket组件1,并使用从客户socket组件1与接收端的从服务socket组件通信。由于从客户socket组件1已经将业务消息成功发送给接收端的从服务socket组件,因此业务消息不会发生丢失。当从客户socket组件1发送业务消息失败时,发送端关闭从客户socket组件1,并建立新的从客户socket组件2,并使用从客户socket组件2与接收端的从服务socket组件通信,以此类推。

可选地,在一个例子中,针对在目标服务socket组件与目标客户socket组件之间建立通信连接的过程,可以包括:发送端通过目标客户socket组件向接收端发送连接请求,且接收端接收该连接请求。其中,该连接请求是发送端从所有从服务socket组件中选择一个从服务socket组件,并将选择的从服务socket组件作为目标服务socket组件后发送的,且该连接请求包括所述选择的从服务socket组件对应的目标地址(即从地址),该目标地址包括主服务socket组件的主地址以及目标后缀(即所述选择的从服务socket组件对应的预设后缀)。

接收端在接收到该连接请求后,根据目标地址,确定该目标地址对应的从服务socket组件(即目标服务socket组件),并通过所述从服务socket组件与目标客户socket组件建立通信连接,对此建立方式不做限制。

其中,根据目标地址,确定该目标地址对应的从服务socket组件,包括:根据主服务socket组件的主地址以及目标后缀,确定对应的从服务socket组件。

例如,发送端11通过socket组件111(即主客户socket组件)与接收端13的socket组件131(即主服务socket组件)建立通信连接,socket组件111通过该通信连接向socket组件131发送业务消息,由socket组件131将业务消息存储到接收队列c1。在业务消息的发送过程中,若业务消息发送失败,则发送端11建立socket组件112(即从客户socket组件),并通过socket组件112与socket组件131建立通信连接,socket组件112通过该通信连接向socket组件131发送业务消息。若业务消息发送失败,则发送端11从所有的从服务socket组件中选择一个从服务socket组件,如socket组件132,并通过socket组件112与socket组件132建立通信连接,socket组件112通过该通信连接向socket组件132发送业务消息,由socket组件132将该业务消息存储到接收队列c2。

综上所述,在socket组件112与socket组件132之间建立通信连接,socket组件112作为目标客户socket组件,socket组件132作为目标服务socket组件。

可选地,在一个例子中,发送端从所有从服务socket组件中选择一个从服务socket组件作为目标服务socket组件,可以包括:发送端确定主服务socket组件的主地址,并利用地址映射策略(即预先配置在发送端的地址映射策略)确定与该主地址对应的目标地址,该目标地址包括主地址以及目标后缀,并将该目标地址对应的从服务socket组件确定为目标服务socket组件。

例如,假设地址映射策略为主地址+特定后缀,且主地址为/myipc,则基于地址映射策略,确定目标地址为/myipc.1,将/myipc.1对应的从服务socket组件确定为目标服务socket组件。基于此,发送端通过目标客户socket组件向接收端发送连接请求时,该连接请求包括的目标地址为/myipc.1。接收端接收到连接请求后,将/myipc.1对应的从服务socket组件确定为目标服务socket组件。

发送端再次确定目标服务socket组件时,基于地址映射策略,发送端确定目标地址为/myipc.2,并将/myipc.2对应的从服务socket组件确定为目标服务socket组件。基于此,发送端在通过目标客户socket组件向接收端发送连接请求时,该连接请求包括的目标地址为/myipc.2。接收端接收到该连接请求后,将/myipc.2对应的从服务socket组件确定为目标服务socket组件,以此类推。

可选地,在一个例子中,当采用上述方式发送业务消息时,还可能存在业务消息的乱序问题。例如,参见图6所示,假设接收端13包括socket组件131(即主服务socket组件)、socket组件132(即从服务socket组件)和socket组件133(即从服务socket组件),接收端13的每个socket组件的队列深度为5(即消息总数量阈值可以为5),此外,发送端11发送业务消息的顺序依次是:业务消息a1-业务消息a2-业务消息a3-业务消息a4-业务消息a5。

发送端11通过socket组件111向socket组件131发送业务消息a1时,若业务消息a1发送成功,则socket组件131将业务消息a1存储到socket组件131的接收队列c1。发送端11通过socket组件111向socket组件131发送业务消息a2时,若业务消息a2发送失败,则发送端11建立socket组件112,在socket组件112与socket组件132之间建立通信连接。发送端11通过socket组件112向socket组件132发送业务消息a2时,若业务消息a2发送成功,则socket组件132将业务消息a2存储到socket组件132的接收队列c2。

发送端11通过socket组件112向socket组件132发送业务消息a3时,若业务消息a3发送失败,则发送端11关闭socket组件112(即删除socket组件112,发送端11不包括socket组件112),并建立新的socket组件113,在socket组件113与socket组件133之间建立通信连接。发送端11通过socket组件113向socket组件133发送业务消息a3时,若业务消息a3发送成功,则socket组件133将业务消息a3存储到socket组件133的接收队列c3。发送端11通过socket组件113向socket组件133发送业务消息a4时,若业务消息a4发送成功,则socket组件133将业务消息a4存储到socket组件133的接收队列c3。

发送端11通过socket组件113向socket组件133发送业务消息a5时,若业务消息a5发送失败,则发送端11关闭socket组件113,建立新的socket组件114,在socket组件114与socket组件132之间建立通信连接。发送端11通过socket组件114向socket组件132发送业务消息a5时,若业务消息a5发送成功,则socket组件132将业务消息a5存储到socket组件132的接收队列c2。

经过上述发送过程,则接收端13存储的业务消息顺序示意图参见图6所示。

进一步的,基于图6所示的业务消息顺序,在第1个计数周期,接收端13可以从接收队列c1中读取业务消息b1,从接收队列c2中读取业务消息a2,从接收队列c3中读取业务消息b3。在第2个计数周期,接收端13可以从接收队列c1中读取业务消息b2,从接收队列c2中读取业务消息b4,从接收队列c3中读取业务消息a3。在第3个计数周期,接收端13可以从接收队列c1中读取业务消息b5,从接收队列c2中读取业务消息a5,从接收队列c3中读取业务消息b8。在第4个计数周期,接收端13可以从接收队列c1中读取业务消息b6,从接收队列c2中读取业务消息b7,从接收队列c3中读取业务消息b10。在第5个计数周期,接收端13可以从接收队列c1中读取业务消息a1,从接收队列c2中读取业务消息b9,从接收队列c3中读取业务消息a4。

综上所述,针对发送端11发送的业务消息,接收端13从接收队列中读取到的业务消息顺序依次是:业务消息a2-业务消息a3-业务消息a5-业务消息a1-业务消息a4。显然,上述业务消息顺序(业务消息a2-业务消息a3-业务消息a5-业务消息a1-业务消息a4)与发送端11发送的业务消息顺序(业务消息a1-业务消息a2-业务消息a3-业务消息a4-业务消息a5)不符,造成乱序问题。

针对上述发现,本申请实施例中,发送端11向接收端13发送业务消息时,该业务消息可以包括消息头和真正数据,该消息头包括用户客户端属性参数(如发送端11的进程标识(processidentification,pid)、主客户socket组件的文件描述符(filedescriptor,fd)等)、业务消息序号、目标服务socket组件的地址、主客户socket组件的地址等。其中,用户客户端属性参数用于唯一确定业务消息的来源;业务消息序号用于确定业务消息的顺序;目标服务socket组件的地址,用于确定业务消息发送给哪个服务socket组件;主客户socket组件的地址,用于向接收端13提供对端地址,即接收端13获取主客户socket组件的地址,利用主客户socket组件的地址向主客户socket组件返回响应消息。

例如,发送端11通过socket组件111向socket组件131发送业务消息a1时,消息头包括:发送端11的pid100、socket组件111的fd0、序号1、socket组件131的主地址、socket组件111的地址。发送端11通过socket组件112向socket组件132发送业务消息a2时,消息头包括:pid100、socket组件112对应的主客户socket组件(即socket组件111)的fd0、序号2、socket组件132的从地址、socket组件112对应的socket组件111的地址。发送端11通过socket组件113向socket组件133发送业务消息a3时,消息头包括:pid100、fd0、序号3、socket组件133的从地址、socket组件111的地址。发送端11通过socket组件113向socket组件133发送业务消息a4时,消息头包括:pid100、fd0、序号4、socket组件133的从地址、socket组件111的地址。发送端11通过socket组件114向socket组件132发送业务消息a5时,消息头包括:pid100、fd0、序号5、socket组件131的从地址、socket组件111的地址。

在上述应用场景下,参见图7所示,数据处理方法还可以包括:

步骤701,在每个计数周期内,接收端分别从每个服务socket组件对应的接收队列读取相同数量的业务消息。其中,接收端的一次读取过程可以称为一个计数周期,在每个计数周期内,分别从每个服务socket组件对应的接收队列读取相同数量的业务消息,如从每个接收队列读取1个业务消息。

步骤702,接收端从读取的所有业务消息中获取属于同一发送端的多个目标业务消息。其中,当发送端向接收端发送多个业务消息时,接收端从读取的所有业务消息中获取属于所述发送端的多个业务信息,将其称为目标业务消息。

具体的,针对已读取的每个业务消息,该业务消息可以包括用户客户端属性参数,如发送端的pid、主客户socket组件的fd等。若已读取的业务消息包括的用户客户端属性参数与发送端的用户客户端属性参数相同,则说明这个已读取的业务消息就是属于该发送端的目标业务消息。在对已读取的每个业务消息进行上述处理后,就可以得到属于该发送端的多个目标业务消息。

步骤703,接收端按照多个目标业务消息的发送顺序,对多个目标业务消息(即属于同一发送端的多个目标业务消息)进行排序。

具体的,针对发送端发送的多个目标业务消息,每个目标业务消息还包括业务消息序号。基于业务消息序号,可以确定每个目标业务消息的发送顺序,并按照所述多个目标业务消息的发送顺序,对多个目标业务消息进行排序。

步骤704,接收端基于多个目标业务消息的排序结果,向上层业务模块依次输出多个目标业务消息,即先向上层业务模块输出排序靠前的目标业务消息。

例如,参见图6所示,在第1个计数周期,接收端13从每个接收队列中读取的业务消息包括:业务消息b1、业务消息a2、业务消息b3。业务消息a2的消息头包括:pid100、fd0、序号2。由于发送端11对应的用户客户端属性参数为pid100和fd0,因此,业务消息a2是属于发送端11的目标业务消息。

在第2个计数周期,接收端13读取的业务消息包括:业务消息b2、业务消息b4、业务消息a3。业务消息a3的消息头包括:pid100、fd0、序号3,因此,业务消息a3是属于发送端11的目标业务消息。以此类推,在第3个计数周期,确定业务消息a5是属于发送端11的目标业务消息。在第4个计数周期,读取的所有业务消息均不是属于发送端11的目标业务消息。在第5个计数周期,确定业务消息a1和业务消息a4是属于发送端11的目标业务消息。

综上所述,接收端13能够从读取的所有业务消息中获取到属于发送端11的目标业务消息,如业务消息a2、业务消息a3、业务消息a5、业务消息a1、业务消息a4。基于业务消息a2包括的序号2、业务消息a3包括的序号3、业务消息a5包括的序号5、业务消息a1包括的序号1、业务消息a4包括的序号4,接收端13可以确定这些目标业务消息的发送顺序,即序号从小到大的顺序。

然后,接收端13按照这些目标业务消息的发送顺序,对这些目标业务消息进行排序,排序结果为业务消息a1-业务消息a2-业务消息a3-业务消息a4-业务消息a5。进一步的,基于目标业务消息的排序结果,接收端13先输出业务消息a1,然后输出业务消息a2,然后输出业务消息a3,然后输出业务消息a4,然后输出业务消息a5,从而向上层业务模块依次输出多个目标业务消息。

其中,接收端13可以将这些目标业务消息输出给上层业务模块,由上层业务模块利用这些目标业务消息进行处理,具体处理方式可以参见传统方式。

由以上技术方案可见,本申请实施例中,通过对属于发送端的多个目标业务消息进行排序,从而能够按照目标业务消息的发送顺序(如业务消息a1-业务消息a2-业务消息a3-业务消息a4-业务消息a5),向上层业务模块依次输出所述多个目标业务消息,从而避免多个目标业务消息的乱序问题。

可选地,在一个例子中,接收端13还可以维护一个数据结构,该数据结构可以包括多个数据项,针对该数据结构中的每个数据项,该数据项以用户客户端属性参数(如发送端的pid、发送端的主客户socket组件的fd)为键值(key),该数据项的值(value)为业务消息链表。业务消息链表的元素为业务消息和业务消息对应的初始计数周期,表示该业务消息是在该初始计数周期读取的。该业务消息链表中的业务消息可以按照序号由小到大的顺序进行排序。

基于此,在步骤702中,针对每个已读取的业务消息,接收端判断数据结构中是否存在与所述业务消息包括的用户客户端属性参数对应的数据项;如果存在,则在该数据项中存储所述业务消息;如果未存在,则在数据结构中建立与该用户客户端属性参数对应的数据项,并在当前建立的数据项中存储所述业务消息。进一步的,接收端可以从数据结构中获取与发送端的用户客户端属性参数对应的数据项,并将获取的数据项中的所有业务消息,均确定为属于所述发送端的目标业务消息,即得到属于所述发送端的多个目标业务消息。

例如,数据结构的初始状态为空。在第1个计数周期,接收端13从每个接收队列中读取的业务消息包括:业务消息b1、业务消息a2、业务消息b3。针对业务消息b1和业务消息b3的处理不再赘述。业务消息a2的消息头包括:pid100、fd0和序号2。由于数据结构不存在与pid100和fd0对应的数据项,因此在数据结构中建立数据项,该数据项以pid100和fd0为键值,在该数据项的业务消息链表中增加元素,该元素包括业务消息a2、业务消息a2对应的初始计数周期(即计数周期1),还包括业务消息a2的序号2,参见图8a所示。

在第2个计数周期,接收端13从每个接收队列中读取的业务消息可以包括:业务消息b2、业务消息b4、业务消息a3。业务消息a3的消息头包括:pid100、fd0和序号3。由于数据结构中存在与pid100和fd0对应的数据项,因此,在该数据项的业务消息链表中增加新元素,该元素包括业务消息a3、业务消息a3对应的初始计数周期(即计数周期2)、序号3,参见图8b所示。

在第3个计数周期,接收端13读取的业务消息包括业务消息a5,消息头包括pid100、fd0和序号5,在数据项的业务消息链表中增加新元素,包括业务消息a5、业务消息a5对应的计数周期3、序号5,参见图8c所示。

在第5个计数周期,接收端13读取的业务消息包括业务消息a1和业务消息a4,业务消息a1的消息头包括pid100、fd0和序号1,业务消息a4的消息头包括pid100、fd0和序号4。在数据项的业务消息链表增加两个新元素,一个元素包括业务消息a1、业务消息a1对应的计数周期5、序号1,另一元素包括业务消息a4、业务消息a4对应的计数周期5、序号4,参见图8d所示。

进一步的,针对业务消息链表的每个业务消息,可以按照序号由小到大的顺序进行排序,参见图8e所示,为排序后的示例,也就是说,序号由小到大的排序结果为业务消息a1-业务消息a2-业务消息a3-业务消息a4-业务消息a5。

其中,针对图8d,按照序号由小到大的顺序排序后,得到图8e。针对图8b和图8c,也可以按照序号由小到大的顺序排序,在此不再赘述。

可选地,在上述实施例中,接收端可以维护一个计数器,通过这个计数器更新计数周期。例如,计数器的初始值为0,接收端从每个服务socket组件对应的接收队列读取业务消息后,将计数器的值加1,即计数器的值为1,表示当前读取的这些业务消息的初始计数周期为计数周期1。接收端再次从每个服务socket组件对应的接收队列读取业务消息后,将计数器的值加1,即计数器的值为2,表示当前读取的这些业务消息的初始计数周期为计数周期2,以此类推。

可选地,在一个例子中,针对步骤704,接收端基于多个目标业务消息的排序结果,向上层业务模块依次输出多个目标业务消息,,可以包括但不限于:接收端从多个目标业务消息中选取排序靠前的待输出目标业务消息,并获取待输出目标业务消息对应的初始计数周期。接收端判断当前计数周期与初始计数周期的差值,是否小于接收队列的队列深度(即消息总数量阈值);如果否,则向上层业务模块输出待输出目标业务消息;如果是,则等到下一个计数周期,并判断当前计数周期与初始计数周期的差值,是否小于接收队列的队列深度。

例如,在第1个计数周期,接收端13得到图8a所示的数据项,排序靠前的待输出目标业务消息是业务消息a2,假设接收队列的队列深度为5,由于业务消息a2的初始计数周期为计数周期1,当前计数周期为计数周期1,因此,当前计数周期与初始计数周期的差值小于接收队列的队列深度,即未满足业务消息a2的输出条件,因此,需要等到下一个计数周期,重新上述处理过程。

在第2个计数周期,接收端13得到图8b所示的数据项,排序靠前的待输出目标业务消息是业务消息a2,当前计数周期为计数周期2,由于当前计数周期与初始计数周期的差值小于接收队列的队列深度,即未满足业务消息a2的输出条件,因此,需要等到下一个计数周期,重新上述处理过程。

在第3个计数周期,接收端13得到图8c所示的数据项,排序靠前的待输出目标业务消息是业务消息a2,当前计数周期为计数周期3,由于当前计数周期与初始计数周期的差值小于接收队列的队列深度,即未满足业务消息a2的输出条件,因此,需要等到下一个计数周期,重新上述处理过程。

在第4个计数周期,接收端13得到图8c所示的数据项,排序靠前的待输出目标业务消息是业务消息a2,当前计数周期为计数周期4,由于当前计数周期与初始计数周期的差值小于接收队列的队列深度,即未满足业务消息a2的输出条件,因此,需要等到下一个计数周期,重新上述处理过程。

在第5个计数周期,接收端13得到图8e所示的数据项,排序靠前的待输出目标业务消息是业务消息a1,而不再是业务消息a2。而且,由于业务消息a1的初始计数周期为计数周期5,当前计数周期为计数周期5,因此,当前计数周期与初始计数周期的差值小于接收队列的队列深度,即未满足业务消息a1的输出条件,因此,需要等到下一个计数周期,重新上述处理过程。

在第6-9个计数周期,排序靠前的待输出目标业务消息是业务消息a1,当前计数周期与初始计数周期的差值小于队列深度,即未满足业务消息a1的输出条件,因此,需要等到下一个计数周期,重新上述处理过程。

在第10个计数周期,排序靠前的待输出目标业务消息是业务消息a1,当前计数周期为计数周期10,当前计数周期10与业务消息a1的初始计数周期5之间的差值,等于接收队列的队列深度,因此向上层业务模块输出业务消息a1。

在输出业务消息a1后,排序靠前的待输出目标业务消息是业务消息a2,由于当前计数周期10与业务消息a2的初始计数周期1的差值,大于接收队列的队列深度,因此向上层业务模块输出业务消息a2。在输出业务消息a2后,排序靠前的待输出目标业务消息是业务消息a3,由于当前计数周期10与业务消息a3的初始计数周期2的差值,大于接收队列的队列深度,因此向上层业务模块输出业务消息a3。在输出业务消息a3后,排序靠前的待输出目标业务消息是业务消息a4,由于当前计数周期10与业务消息a4的初始计数周期5的差值,等于接收队列的队列深度,因此向上层业务模块输出业务消息a4。在输出业务消息a4后,排序靠前的待输出目标业务消息是业务消息a5,由于当前计数周期10与业务消息a5的初始计数周期3的差值,大于接收队列的队列深度,因此向上层业务模块输出业务消息a5。显然,在上述方式中,能够按照顺序依次输出业务消息a1-业务消息a2-业务消息a3-业务消息a4-业务消息a5。

其中,采用上述时机输出业务消息(即当前计数周期与初始计数周期的差值,大于或等于队列深度,才输出业务消息),其原因可以在于:

发送端11先向接收端13发送业务消息a1,后向接收端13发送业务消息a2,接收端13需要先输出业务消息a1,后输出业务消息a2。如图6所示,接收端13在第1个计数周期,将业务消息a2存储到数据项,在第5个计数周期,将业务消息a1存储到该数据项。显然,若在第1-5个计数周期的这段时间内,接收端13输出业务消息a2,那么,就存在先输出业务消息a2,后输出业务消息a1的问题。综上所述,接收端13应该保证输出业务消息a2之前,已经在数据项中存储业务消息a1,从而确保先输出业务消息a1,后输出业务消息a2。

由于发送端11先向接收端13发送业务消息a1,后向接收端13发送业务消息a2,因此,接收端13在接收队列中存储业务消息a2之前,已经在接收队列中存储业务消息a1,也就是说,业务消息a1对应的初始计数周期与业务消息a2对应的初始计数周期之间的差值,小于接收端13的接收队列的队列深度。

综上所述,由于业务消息a1对应的初始计数周期与业务消息a2对应的初始计数周期之间的差值,小于接收队列的队列深度,因此,若当前计数周期与业务消息a2对应的初始计数周期之间的差值,大于或等于接收队列的队列深度,则说明当前计数周期之前,接收端13已经将业务消息a1存储到数据项中。

针对上述发现,本申请实施例中,针对每个业务消息(如业务消息a2)来说,若当前计数周期与该业务消息对应的初始计数周期之间的差值,大于或者等于接收队列的队列深度,则允许输出该业务消息。进一步的,当该业务消息是数据项中排序最靠前的待输出目标业务消息时,则可以输出该业务消息。

可选地,在一个例子中,当接收端13的接收队列中已经不存在业务消息时,即接收队列的所有业务消息均存储在数据项中,接收端13也可以输出数据项中排序靠前的业务消息,而不需要在当前计数周期与业务消息的初始计数周期的差值,大于或者等于队列深度后,才输出数据项中的业务消息。

可选地,在一个例子中,接收端13在输出业务消息时,可以将业务消息存储到上层业务模块的缓冲区(buffer)中,这样,上层业务模块能够从缓冲区(buffer)中读取这些业务消息,并利用这些业务消息进行处理。

可选地,在一个例子中,接收端13在输出业务消息时,先从数据项中获取多个业务消息,并将这些业务消息存储到接收端13的准备队列(readyqueue)。然后,接收端13可以将readyqueue中的每个业务消息,依次存储到上层业务模块的缓冲区中,这样,上层业务模块能够从缓冲区中读取这些业务消息。

参见上述实施例,在第10个计数周期,能够输出业务消息a1、业务消息a2、业务消息a3、业务消息a4和业务消息a5,因此,接收端13从数据项中获取业务消息a1、业务消息a2、业务消息a3、业务消息a4和业务消息a5,并将业务消息a1、业务消息a2、业务消息a3、业务消息a4和业务消息a5存储到readyqueue。然后,从readyqueue中获取排序靠前的业务消息a1,将业务消息a1存储到上层业务模块的缓冲区中;从readyqueue中获取排序靠前的业务消息a2,将业务消息a2存储到上层业务模块的缓冲区中,以此类推。

可选地,在一个例子中,可以结合如下实施例介绍数据结构的变化过程。

首先,参见图9a所示,为时刻1的接收队列,假设计数器为100,表示当前计数周期为第100个计数周期,数据结构可以为空。

然后,假设每个接收队列的第一个业务消息被接收,即msg2被接收,则msg2需要存储到数据结构的数据项中,且msg2对应的初始计数周期可以为100。参见图9b所示,为时刻2的接收队列,计数器的值被更新为101。

然后,假设每个接收队列的第一个业务消息被接收,即msg3被接收,则msg3需要存储到数据结构的数据项中,且msg3对应的初始计数周期可以为101。参见图9c所示,为时刻3的接收队列,计数器的值被更新为102。

然后,假设每个接收队列的第一个业务消息被接收,即msg5被接收,则msg5需要存储到数据结构的数据项中,且msg5对应的初始计数周期可以为102。参见图9d所示,为时刻4的接收队列,计数器的值被更新为103。

然后,假设每个接收队列的第一个业务消息被接收,当前没有业务消息存储到数据项中,参见图9e所示,为时刻5的接收队列,计数器的值被更新为104。

然后,假设每个接收队列的第一个业务消息被接收,即msg1和msg4被接收,则msg1和msg4需要存储到数据结构的数据项中,而且,msg1对应的初始计数周期可以为104,msg4对应的初始计数周期可以为104。参见图9f所示,为时刻6的接收队列,计数器的值被更新为105。

相应地,基于与上述方法同样的申请构思,本申请实施例还提出一种消息处理装置,应用于接收端,所述接收端包括多个服务socket组件,每个服务socket组件对应一个接收队列,参见图10所示,为所述装置的结构图,所述装置包括:

建立模块1001,用于通过目标服务socket组件与发送端包括的目标客户socket组件建立通信连接;其中,所述目标服务socket组件是所述多个服务socket组件中的任意一个,所述目标客户socket组件是所述发送端包括的至少一个客户socket组件中的任意一个;

存储模块1002,用于将所述发送端通过所述通信连接发送的业务消息,存储到所述目标服务socket组件对应的接收队列。

可选地,在一个例子中,所述多个服务socket组件包括主服务socket组件和至少一个从服务socket组件;所述建立模块1001,具体用于:

接收所述发送端通过所述目标客户socket组件发送的连接请求;其中,所述连接请求是所述发送端从所有从服务socket组件中选择一个从服务socket组件,并将选择的从服务socket组件作为目标服务socket组件后发送的;所述连接请求包括所述选择的从服务socket组件对应的目标地址;

根据所述目标地址,确定所述目标地址对应的从服务socket组件;

通过所述从服务socket组件与所述目标客户socket组件建立通信连接。

可选地,在一个例子中,所述主服务socket组件与主地址绑定,所述至少一个从服务socket组件中的每个从服务socket组件与一个从地址绑定,所述从地址包括所述主地址以及预设后缀,每个从地址包括的预设后缀均不同;

所述目标地址包括所述主地址以及目标后缀;所述建立模块1001根据所述目标地址,确定所述目标地址对应的从服务socket组件时用于:根据所述主地址以及目标后缀,确定对应的从服务socket组件。

可选地,在一个例子中,所述装置还包括(在图10中未示出):

读取模块,用于在每个计数周期内,分别从每个服务socket组件对应的接收队列读取相同数量的业务消息;

获取模块,用于从读取的所有业务消息中获取属于同一发送端的多个目标业务消息;

排序模块,用于按照多个目标业务消息的发送顺序,对所述多个目标业务消息进行排序;

输出模块,用于基于所述多个目标业务消息的排序结果,向上层业务模块依次输出所述多个目标业务消息。

可选地,在一个例子中,所述业务消息包括用户客户端属性参数;所述获取模块,具体用于:判断数据结构中是否存在与已读取的业务消息包括的用户客户端属性参数对应的数据项;

如果存在,则在所述数据项中存储所述业务消息;如果未存在,则在所述数据结构中建立与所述用户客户端属性参数对应的数据项,并在建立的数据项中存储所述业务消息;

从所述数据结构中获取与发送端的用户客户端属性参数对应的数据项,将获取的数据项中的所有业务消息,确定为属于所述发送端的目标业务消息。

可选地,在一个例子中,所述输出模块,具体用于:

从所述多个目标业务消息中选取排序靠前的待输出目标业务消息;

获取所述待输出目标业务消息对应的初始计数周期;

判断当前计数周期与初始计数周期的差值,是否小于接收队列的队列深度;

如果否,则向上层业务模块输出所述待输出目标业务消息;

如果是,则等到下一个计数周期,并判断当前计数周期与初始计数周期的差值,是否小于接收队列的队列深度。

本申请实施例提供的服务端,从硬件层面而言,硬件架构示意图可以参见图11所示,可以包括:机器可读存储介质和处理器,其中:

机器可读存储介质:存储指令代码。

处理器:与机器可读存储介质通信,读取和执行机器可读存储介质中存储的所述指令代码,实现本申请上述示例公开的消息处理操作。

这里,机器可读存储介质可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:ram(radomaccessmemory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可以由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

而且,这些计算机程序指令也可以存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或者多个流程和/或方框图一个方框或者多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或者其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1