进行通信的方法和通信设备与流程

文档序号:16067579发布日期:2018-11-24 12:49阅读:203来源:国知局

本发明涉及计算机技术领域,特别涉及一种进行通信的方法和装置。

背景技术

随着计算机技术的发展,在进程间或线程间通信时,常常采用消息队列的方式进行通信。

相关技术中,在进程间通信时,发送消息的进程属于写进程,接收消息的进程属于读进程,在共享内存中可以创建一个消息队列,并设置消息队列中每个数据块所能存储数据的数据量大于或等于发送的消息的最大数据量。消息队列包括头部、索引区和数据区,头部区用于保存队列的总长度和每个数据块所能存储数据的数据量,索引区用于保存数据区的数据块的索引号,索引号与数据块一一对应,数据区包括多个数据块,用于保存数据。

写进程可以将消息写入数据块,读进程可以周期性检测有没有新的消息写入数据块,如果有,则可以读取数据块中的消息。这样,就可以实现进程间通信。

在实现本发明的过程中,发明人发现相关技术至少存在以下问题:

由于消息队列中每个数据块所能存储数据的数据量大于或等于发送的消息的最大数据量,所以对于数据量较小的消息仅占用一个数据块的一小部分存储空间,从而在消息的数据量大小不一的情况下,会导致浪费大量的存储空间。



技术实现要素:

为了解决相关技术的问题,本发明实施例提供了一种进行通信的方法和通信设备。所述技术方案如下:

第一方面,提供了一种进行通信的方法,所述方法包括:

在将第一消息写入消息队列时,根据所述第一消息的数据量,确定所述第一消息占用所述消息队列中数据块的数目;

将所述消息队列对应的写偏移更新为当前对应所述消息队列存储的写偏移与所述数目之和,其中,所述写偏移用于指示当前已经写入数据的数据块的最大索引号;

根据更新后的写偏移和所述数目,确定所述第一消息占用所述消息队列中的数据块;

将所述第一消息写入确定出的数据块。

可选的,所述将所述第一消息写入确定出的数据块,包括:

在所述消息队列中,按照确定出的数据块的索引号从大到小的顺序,依次将所述第一消息写入所述确定出的数据块。

可选的,所述方法还包括:

当所述确定出的数据块中第一数据块写入完成时,更新所述第一数据块的索引号对应的状态标识为完成标识。

可选的,所述方法还包括:

当所述确定出的数据块中第二数据块写入完成时,根据所述确定出的数据块的索引号,存储所述第二数据块的索引号对应的序号。

可选的,所述方法还包括:

创建消息队列,其中,所述消息队列包括头部区、读写监控区、索引区和数据区,所述读写监控区用于存储所述写偏移和读偏移,所述读偏移用于指示当前已经读出数据的数据块的最大索引号,所述数据区包括至少一个数据块。

第二方面,提供了一种进行通信的方法,所述方法包括:

获取当前消息队列对应的读偏移和写偏移,其中,所述写偏移用于指示当前已经写入数据的数据块的最大索引号,所述读偏移用于指示当前已经读出数据的数据块的最大索引号;

如果所述读偏移小于所述写偏移,则根据所述读偏移,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,并将所述读偏移更新为所述读偏移与确定出的数据块的数目之和;

根据所述第二消息的数据量,从所述确定出的数据块中,读取所述第二消息。

可选的,所述根据所述读偏移,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,包括:

根据所述读偏移,确定与所述读偏移对应的数据块相邻的下一个数据块的索引号;

根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,包括:

获取所述索引号对应的状态标识,

如果所述状态标识是完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量;

如果所述状态标识不是完成标识,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述如果所述状态标识是完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,包括:

如果所述状态标识是完成标识,且所述索引号对应的序号为预设数值,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量;

所述如果所述状态标识不是完成标识,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,包括:

所述如果所述状态标识不是完成标识,且所述索引号对应的序号为预设数值,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述方法还包括:

如果所述状态标识不是完成标识,且所述序号为所述预设数值,且在预设时长内所述状态标识未更新为完成标识,则放弃读取所述第二消息。

可选的,所述根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,包括:

获取所述索引号对应的未读取第二消息的数据量;

根据所述第二消息的数据量,确定所述第二消息占用所述消息队列中数据块的数目;

根据所述索引号和所述数目,确定所述第二消息占用所述消息队列中的数据块。

第三方面,提供了一种通信设备,所述通信设备,包括:

第一确定模块,用于在将第一消息写入消息队列时,根据所述第一消息的数据量,确定所述第一消息占用所述消息队列中数据块的数目;

更新模块,用于将所述消息队列对应的写偏移更新为当前对应所述消息队列存储的写偏移与所述数目之和,其中,所述写偏移用于指示当前已经写入数据的数据块的最大索引号;

第二确定模块,用于根据更新后的写偏移和所述数目,确定所述第一消息占用所述消息队列中的数据块;

写入模块,用于将所述第一消息写入确定出的数据块。

可选的,所述写入模块,用于:

在所述消息队列中,按照确定出的数据块的索引号从大到小的顺序,依次将所述第一消息写入所述确定出的数据块。

可选的,所述更新模块,还用于:

当所述确定出的数据块中第一数据块写入完成时,更新所述第一数据块的索引号对应的状态标识为完成标识。

可选的,所述通信设备还包括:

存储模块,用于当所述确定出的数据块中第二数据块写入完成时,根据所述确定出的数据块的索引号,存储所述第二数据块的索引号对应的序号。

可选的,所述通信设备还包括:

创建模块,用于创建消息队列,其中,所述消息队列包括头部区、读写监控区、索引区和数据区,所述读写监控区用于存储所述写偏移和读偏移,所述读偏移用于指示当前已经读出数据的数据块的最大索引号,所述数据区包括至少一个数据块。

第四方面,提供了一种通信设备,所述通信设备,包括:

获取模块,用于获取当前消息队列对应的读偏移和写偏移,其中,所述写偏移用于指示当前已经写入数据的数据块的最大索引号,所述读偏移用于指示当前已经读出数据的数据块的最大索引号;

确定模块,用于如果所述读偏移小于所述写偏移,则根据所述读偏移,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,并将所述读偏移更新为所述读偏移与确定出的数据块的数目之和;

读取模块,用于根据所述第二消息的数据量,从所述确定出的数据块中,读取所述第二消息。

可选的,所述确定模块,用于:

根据所述读偏移,确定与所述读偏移对应的数据块相邻的下一个数据块的索引号;

根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述确定模块,用于:

获取所述索引号对应的状态标识,

如果所述状态标识是完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量;

如果所述状态标识不是完成标识,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述确定模块,用于:

如果所述状态标识是完成标识,且所述索引号对应的序号为预设数值,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量;

所述确定模块,用于:

所述如果所述状态标识不是完成标识,且所述索引号对应的序号为预设数值,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述确定模块,还用于:

如果所述状态标识不是完成标识,且所述序号为所述预设数值,且在预设时长内所述状态标识未更新为完成标识,则放弃读取所述第二消息。

可选的,所述确定模块,用于:

获取所述索引号对应的未读取第二消息的数据量;

根据所述第二消息的数据量,确定所述第二消息占用所述消息队列中数据块的数目;

根据所述索引号和所述数目,确定所述第二消息占用所述消息队列中的数据块。

第五方面,提供了一种通信设备,所述通信设备包括处理器和存储器,所述存储器中存储有至少一条指令,所述指令由所述处理器加载并执行以实现第一方面和第二方面所述的进行通信的方法。

第六方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述指令由处理器加载并执行以实现第一方面和第二方面所述的进行通信的方法。

本发明实施例中,由于在往消息队列中写入消息时,一个消息可以占用多个数据块,所以即使消息的数据量比较大,也不用将数据块所能存储数据的数据量设置的比较大,所以可以节约存储空间。

附图说明

图1是本发明实施例提供的一种消息队列的示意图;

图2是本发明实施例提供的一种进行通信的方法的流程示意图;

图3是本发明实施例提供的一种写入消息的示意图;

图4是本发明实施例提供的一种进行通信的方法的流程示意图;

图5是本发明实施例提供的一种进行通信的装置的结构示意图;

图6是本发明实施例提供的一种进行通信的装置的结构示意图;

图7是本发明实施例提供的一种进行通信的装置的结构示意图;

图8是本发明实施例提供的一种进行通信的装置的结构示意图;

图9是本发明实施例提供的一种服务器的结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。

本发明实施例提供了一种进行通信的方法,该方法的执行主体为通信设备,通信设备可以是服务器或终端中的发送者和接受者,终端可以是手机、平板、电脑等,发送者可以是写进程,接收者可以是读进程,或者发送者可以是写线程,接收者可以是读线程。

终端中可以设置有处理器、存储器和收发器等,处理器可以用于进行通信的过程的处理,存储器可以用于进行通信的过程中需要的数据以及产生的数据,收发器可以用于接收以及发送数据。

服务器中可以设置有处理器、存储器和收发器等,处理器可以用于进行通信的过程的处理,存储器可以用于进行通信的过程中需要的数据以及产生的数据,收发器可以用于接收以及发送数据。

本发明实施例以执行主体为服务器为例、发送者以写进程,接收者以读进程为例进行方案的详细说明,其他情况与之类似,不再赘述。

本申请的应用场景为:多个写进程往消息队列中写入消息,一个读进程从消息队列中读取消息,或者多个写线程往消息队列中写入消息,一个读线程从消息队列中读取消息。多个写进程与一个读进程可以属于相同应用程序,也可以属于不同应用程序,多个写线程与一个读线程可以属于相同应用程序,也可以属于不同应用程序,多个写进程属于同一应用程序或不同应用程序,多个写线程属于同一应用程序或不同应用程序。

首先介绍一下本发明实施例中,创建消息队列的过程:

如图1所示,写进程在写入消息前可以请求主进程创建消息队列,或者自己创建消息队列,消息队列中包括头部区、读写监控区、索引区和数据区,该消息队列是无锁消息队列。

头部区包括消息队列的总长度(能存储的总数据量)、消息队列的版本号、每个数据块所能存储数据的数据量等。

读写监控区用于存储读偏移和写偏移,读偏移用于指示当前已经读出数据的数据块的最大索引号,写偏移用于指示当前已经写入数据的数据块的最大索引号。

索引区用于存储每个数据块的索引号,以及每个索引号对应的索引信息,索引信息中包括状态标识、所存储消息的总数据量或在该数据块中存储消息的数据量(对于某个数据块,如果是消息占用的第一个数据块,就是该消息的总数据量,如果不是消息占用的第一个数据块,就是该消息在该数据块中写入数据的数据量)、序号等,序号用于指示消息所占用的数据块中的第几个数据块(如序号为3,表示消息占用的第三个数据块),也就是在读取消息时,第几个被读取。

数据区包括至少一个能存储相同数据量的数据块。

如图2所示,对于多个写进程中的每个写进程在消息队列中写入消息的处理流程可以如下:

步骤201,在将第一消息写入消息队列时,根据第一消息的数据量,确定第一消息占用消息队列中数据块的数目。

其中,第一消息可以是写进程发送至读进程的任一消息,例如,第一消息可以是用于通知读进程可以执行下一步处理的消息等。

在实施中,写进程要往消息队列写入第一消息时,可以确定第一消息的数据量,然后获取消息队列中数据块所能存储数据的数据量(消息队列中每个数据块所能存储数据的数据量是相等的),然后使用第一消息的数据量除以数据块所能存储数据的数据量,得到一个数值,如果得到的数值为整数,则第一消息占用消息队列中数据块的数目为该数值,如果得到的数值为非整数,则第一消息占用消息队列中数据块的数目为该数值的整数部分加一。例如,每个数据块所能存储数据的数据量为2k,第一消息的数据量为7k,得到的数值为3.5,第一消息占用消息队列中数据块的数目为4。

需要说明的是,上述消息队列中数据块所能存储数据的数据量,可以根据业务需要进行调整,如消息的数据量均比较大,每个数据块所能存储数据的数据量也可以大一点,如果消息的数据量均比较小,每个数据块所能存储数据的数据量也可以小点。一般情况下每个数据块所能存储数据的数据量小一点,可以减少存储资源的浪费。

另外,写进程在往消息队列中写入消息时,还可以获取消息队列的版本号,如果消息队列的版本号不是最新的版本号,则可以请求主进程更新消息队列,或者自己更新消息队列。

步骤202,将消息队列对应的写偏移更新为当前对应消息队列存储的写偏移与数目之和。

其中,写偏移用于指示当前已经写入数据的数据块的最大索引号。

在实施中,写进程在确定第一消息占用消息队列中数据块的数目后,可以获取当前对应消息队列存储的写偏移,也就是当前已经写入数据的数据块的最大索引号,然后使用原子函数将消息队列的写偏移更新为当前对应消息队列存储的写偏移与数目之和。

这样,及时的更新写偏移,可以优先抢占连续的数据块。这是由于有多个写进程,都在往消息队列中写入消息,如果不先占住自己所用的数据块,那么其他写进程有可能会占用了自己想占用的数据块。例如,某个写进程需要占用三个数据块写第一消息,结果在第一个数据块中写第一消息时,相邻的第二个数据块被另一个进程占用写自己的数据,这样会导致第一消息的数据不连续,所以要先将写偏移修改,以告知其他写进程要写消息时,从当前写偏移对应的下一个数据块开始写消息。

步骤203,根据更新后的写偏移和数目,确定第一消息占用消息队列中的数据块。

在实施中,写进程可以基于写偏移,确定出最大索引号,然后使用该最大索引号减去第一消息占用消息队列中数据块的数目,然后加一得到,第一消息所占用消息队列中的数据块的最小索引号,这样,就得到了第一消息所占用消息队列中的数据块的最小索引号和最大索引号,进而可以根据最小索引号和最小索引号,确定出第一消息占用消息队列中的数据块。

步骤204,将第一消息写入确定出的数据块。

在实施中,写进程在确定出第一消息占用消息队列中的数据块后,可以将第一消息写入确定出的数据块中。

另外,写进程在将第一消息写入确定出的数据块后,可以向读进程发送消息写入通知,该消息写入通知用于指示有新的消息写入数据块,读进程可以去消息队列读取消息。

可选的,为了降低读进程读取消息时出现错误,写进程可以按照以下方式在数据块中写入消息,相应的步骤204的处理可以如下:

在消息队列中,按照确定出的数据块的索引号从大到小的顺序,依次将第一消息写入确定出的数据块。

在实施中,写进程在确定出第一消息占用消息队列中的数据块后,可以按照确定出的数据块的索引号从大到小的顺序,先在索引号最大的数据块中写入消息,再在索引号次之数据中写入消息,按照这种顺序,将第一消息写入数据块中。例如,如图3所示,第一消息占用三个数据块,索引号为1、2、3,(1)先在索引号为3的数据块中写入消息,(2)然后再在索引号为2的数据块中写入消息,(3)最后在为1的数据块中写入消息。

需要说明的是,如果第一消息不能恰好将整数个数据块写满,可以在索引号最大的数据块不写满,写入的数据量也就是第一消息的数据量除以数据块存储数据的数据量得到的余数对应的数据量。例如,第一消息的数据量为8k,每个数据块所存储数据的数据量为3k,8k除以3k得到2余2k,占用三个数据块,在索引号最大的数据块中写入2k的第一消息,在其余两个数据块中写入3k的第一消息。

另外,在索引号最小的数据块中写完第一消息后,将索引号最小的数据块的索引号对应存储第一消息的数据量,而且对应其它数据块中每个数据块的索引号分别存储在该数据块中写入第一消息的数据量(也就是在该数据块中存储了多少数据),其它数据块为在确定出的数据块中除索引号最小的数据块之外的数据块。

可选的,在将第一消息写入确定出的数据块后,还可以更新状态标识,表示在某个数据中写入完成,相应的处理可以如下:

当确定出的数据块中第一数据块写入完成时,更新第一数据块的索引号对应的状态标识为完成标识。

其中,数据块的索引号对应的索引信息中包括状态标识,状态标识用于指示在数据块中写入是否完成,第一数据块为确定出的数据中的任一数据块。

在实施中,在按照索引号从大到小的顺序将第一消息写入确定出的数据块的过程中,在第一数据块中写完第一消息时,可以将第一数据块的索引号对应的索引信息中的状态标识为完成标识,以标识第一数据块中已经写入消息。这样,只要第一消息所占用的第一个数据块(也就是确定出的数据块中索引号最小的数据块)对应的状态标识为完成标识,第一消息就写入完成。

可选的,为了防止读进程读取消息不完整,在写进程在数据块中写入消息后,要对应数据块的索引号存储序号(序号用于指示消息占用的第几个数据块),相应的处理处理可以如下:

当确定出的数据块中第二数据块写入完成时,根据确定出的数据块的索引号,存储第二数据块的索引号对应的序号。

其中,第二数据块为确定出的数据块中任一数据块,第二数据块可以与上述提到的第一数据块为同一数据块。

在实施中,在按照索引号从大到小的顺序将第一消息写入确定出的数据块的过程中,在第二数据块中写入自己应该存储第一消息的那部分数据时,可以根据确定出的数据块的索引号,存储第二数据块的索引号对应的序号。

可选的,确定出的数据块为一个时,存储第二数据的索引号对应的序号的处理可以如下:

在按照索引号从大到小的顺序将第一消息写入确定出的数据块的过程中,在第二数据块中写入自己应该存储第一消息的那部分数据时,可以存储第二数据块的索引号对应的索引信息中的序号为预设数值,预设数值用于指示第一消息占用的数据块中索引号最小的数据块。

可选的,确定出的数据块为至少两个时,存储第二数据的索引号对应的序号的处理可以如下:

如果第二数据块的索引号均小于其它数据块的索引号,则存储第二数据块的索引号对应的序号为预设数值。如果第二数据块的索引号不是均小于其它数据块的索引号,则根据其它数据块的索引号,存储第二数据块的索引号对应的序号。

其中,第二数据块为确定出的数据块中任一数据块,第二数据块可以与上述提到的第一数据块为同一数据块。

在实施中,在按照索引号从大到小的顺序将第一消息写入确定出的数据块的过程中,在第二数据块中写入自己应该存储第一消息的那部分数据时,如果第二数据块的索引号在确定出的数据块的索引号中最小,则可以存储第二数据块的索引号对应的索引信息中的序号为预设数值。

如果第二数据块的索引号在确定出的数据块的索引号中不是最小,则可以根据确定出的数据块中除第二数据块之外的其它数据块的索引号,然后根据第二数据块的索引号在其它数据块的索引号的排列位置,存储第二数据块的索引号对应的序号。

可选的,在第二数据块的索引号不是均小于其它数据块的索引号的情况下,存储第二数据块的索引号对应的序号的方法可以如下:

第一消息占用三个数据块,在第二数据块的索引号不是均小于其它数据块的索引号的情况下,如果第二数据块的索引号在其它数据块的索引号中次小,可以存储第二数据块的索引号对应的序号为第一预设数值(由技术人员预设),如果第二数据块的索引号在其它数据块的索引号中大于其它数据块的索引号中两个索引号,可以存储第二数据块的索引号对应的序号为第二预设数值(由技术人员预设),第一预设数值,用于指示第一消息占用的第二个数据块,第二预设数值用于指示第一消息占用的第三个数据块。

本发明实施例中,由于在往消息队列中写入消息时,一个消息可以占用多个数据块,所以即使消息的数据量比较大,也不用将数据块所能存储数据的数据量设置的比较大,所以可以节约存储空间。

本发明另一实施例提供了读进程读取消息的过程,如图4所示,相应的处理流程可以如下:

步骤401,获取当前消息队列对应的读偏移和写偏移。

其中,写偏移用于指示当前已经写入数据的数据块的最大索引号,读偏移用于指示当前已经读出数据的数据块的最大索引号。

在实施中,读进程可以按照预设周期(周期比较小,如15毫秒等)从消息队列的读写监控区,获取当前消息队列对应的读偏移和写偏移。

另外,也可以是接收到消息写入通知后,获取当前消息队列对应的读偏移和写偏移。

步骤402,如果读偏移小于写偏移,则根据读偏移,确定未读取第二消息占用消息队列中的数据块和第二消息的数据量,并将读偏移更新为读偏移与确定出的数据块的数目之和。

其中,第二消息是消息队列中未读取的任一消息,由于读进程只知道可以读取消息了,并不知道要读取那个消息,所以在此处并不是特指某个消息,第二消息可以与第一消息相同。

在实施中,读进程获取到读偏移和写偏移后,可以判断读偏移和写偏移的大小,如果读偏移小于写偏移(如果读偏移小于写偏移,说明有写进程在消息队列中写入消息),则可以根据读偏移,确定出第二消息占用消息队列中的数据块和第二消息的数据量。

并且读进程可以将读偏移更新为读偏移与确定出的数据块的数目之和,这样下次就能按照更新后的读偏移读取消息。

可选的,可以根据索引号来确定第二消息占用消息队列中的数据块和第二消息的数据量,相应的步骤402的处理可以如下:

根据读偏移,确定与读偏移对应的数据块相邻的下一个数据块的索引号;根据索引号,确定未读取第二消息占用消息队列中的数据块和第二消息的数据量。

在实施中,读进程可以确定读偏移对应的数据块的索引号,然后使用该索引号,然后将该索引号加一,即为相邻的下一个数据块的索引号,也就是第二消息占用的第一个数据块。然后根据该索引号,确定第二消息占用消息队列中的数据块和第二消息的数据量。例如,读偏移为当前已经读取数据的数据块的最大索引号,读偏移为5,将该读偏移加一,得到索引号为6。

由于该下一个数据块是第二消息占用的第一个数据块(索引号最小的数据块),所以其中包括的数据量是第二消息的数据量。

可选的,在读取消息前还需要先判断消息是否写入数据块中,相应的处理可以如下:

获取索引号对应的状态标识,如果状态标识是完成标识,则根据索引号,确定未读取第二消息占用消息队列中的数据块和第二消息的数据量;如果状态标识不是完成标识,且在预设时长之内状态标识被更新为完成标识,则根据索引号,确定未读取第二消息占用消息队列中的数据块和第二消息的数据量。

其中,完成标识用于指示该数据块中存储的第二消息已经全部写入,预设时长可以由技术人员预设,并且存储至服务器中。

在实施中,读进程可以获取索引号对应的状态标识,如果该状态标识为完成标识,可以获取索引号对应的第二消息的数据量,将第二消息的数据量除以每个数据块所能存储数据的数据量,得到一个数值,如果得到的数值为整数,则第二消息占用消息队列中数据块的数目为该数值,如果得到的数值为非整数,则第二消息占用消息队列中数据块的数目为该数值的整数部分加一。

如果该状态标识不是完成标识,则可以等待预设时长,在预设时长内状态标识更新为完成标识,读进程可以获取索引号对应的第二消息的数据量,然后将第二消息的数据量除以每个数据块所能存储数据的数据量,得到一个数值,如果得到的数值为整数,则第二消息占用消息队列中数据块的数目为该数值,如果得到的数值为非整数,则第二消息占用消息队列中数据块的数目为该数值的整数部分加一。

在获取到第二消息占用消息队列中数据块的数目后,可以从上述下一个数据块的索引号基础上增加该数目然后减去一,就得到了第二消息占用消息队列中数据块的最大索引号,然后根据上述下一个数据块的索引号(也就是第二消息占用的数据块的最小索引号)和最大索引号,就可以确定出第二消息占用消息队列中的数据块。

可选的,在确定第二消息的数据量时,还需要判断上述确定出的下一个数据块是不是第二消息占用的第一个数据块,相应的处理可以如下:

如果状态标识是完成标识,且索引号对应的序号为预设数值,则根据索引号,确定未读取第二消息占用消息队列中的数据块和第二消息的数据量;如果状态标识不是完成标识,且索引号对应的序号为预设数值,且在预设时长之内状态标识被更新为完成标识,则根据索引号,确定未读取第二消息占用消息队列中的数据块和第二消息的数据量。

其中,预设数值由技术人员预设,用于指示某个消息占用的第一个数据块,如1、0等。

在实施中,消息队列中的每个数据块均对应有索引号,每个索引号还对应一个序号,对于某个数据块,该数据块的索引号对应的序号用于指示该数据块是第二消息占用的第几个数据块,例如,序号为1的数据块为第二消息占用的第一个数据块,序号为2的数据块为第二消息占用的第二个数据块。

读进程可以获取索引号对应的索引信息,从中获取索引号对应的状态标识,如果该状态标识为完成标识,则可以获取索引信息中的序号,如果该序号为预设数值,则可以从索引信息中获取第二消息的数据量,将第二消息的数据量除以每个数据块所能存储数据的数据量,得到一个数值,如果得到的数值为整数,则第二消息占用消息队列中数据块的数目为该数值,如果得到的数值为非整数,则第二消息占用消息队列中数据块的数目为该数值的整数部分加一。

如果该状态标识不是完成标识,则可以等待预设时长,如果在预设时长内状态标识更新为完成标识,则可以获取索引信息中的序号,如果该序号为预设数值,则读进程可以从索引消息中读取到第二消息的数据量,然后将第二消息的数据量除以每个数据块所能存储数据的数据量,得到一个数值,如果得到的数值为整数,则第二消息占用消息队列中数据块的数目为该数值,如果得到的数值为非整数,则第二消息占用消息队列中数据块的数目为该数值的整数部分加一。

这样,由于写进程是采用索引号从大到小的顺序往数据块中写入第二消息,所以只要第二消息占用的第一个数据块(也就是索引号最小的数据块)写入完成,就可以说明第二消息全部写入完成,从而可以减少下述情况的发生:按照索引号从小到大的顺序写入,在写进程发生错误时,仅在第一个数据块中进行写入,而在其它数据块中写入失败的情况,导致的第二消息读取失败。

可选的,可以首先获取第二消息的数据量,然后再确定第二消息占用消息队列中的数据块,相应的处理可以如下:

获取索引号对应的未读取第二消息的数据量;根据第二消息的数据量,确定第二消息占用消息队列中数据块的数目;根据索引号和数目,确定第二消息占用消息队列中的数据块。

在实施中,首先可以获取索引号对应的索引信息中第二消息的数据量,然后将第二消息的数据量除以每个数据块所能存储数据的数据量,得到一个数值,如果得到的数值为整数,则第二消息占用消息队列中数据块的数目为该数值,如果得到的数值为非整数,则第二消息占用消息队列中数据块的数目为该数值的整数部分加一。然后将索引号与得到的数目相加,减去一,第二消息占用的数据块的最大索引号,然后使用上述下一个数据块的索引号(也就是第二消息占用的数据块的最小索引号)和最大索引号,就可以确定出第二消息占用消息队列中的数据块。

可选的,如果在预设时长内状态标识还未更新成完成标识,读进程可以放弃读取第二消息,相应的处理可以如下:

如果状态标识不是完成标识,且序号为预设数值,且在预设时长内状态标识未更新为完成标识,则放弃读取第二消息。

在实施中,读进程可以获取索引号对应的索引信息,从中获取索引号对应的状态标识,如果该状态标识不是完成标识,则可以等待预设时长,如果在预设时长内状态标识还未更新为完成标识,可以不再读取第二消息。

另外,在放弃读取第二消息后,可以读取更新后的读偏移(在步骤403中进行解释)对应的下一个数据块中存储的消息,读取更新后的读偏移对应的下一个数据块中存储的消息的方法与前面提到的方法相同,此处不再赘述。

步骤403,根据第二消息的数据量,从确定出的数据块中,读取第二消息。

在实施中,读进程在确定出第二消息占用消息队列中的数据块和第二消息的数据量后,可以从确定出的数据块中,按照第二消息的数据量,读取出第二消息。例如,第二消息为8k,数据块所能存储数据的数据量为3k,占用了3个数据块,在第一个数据块中写入3k的第二消息,在第二个数据块中写入3k的第二消息,在第三数据块中写入2k的第二消息,读进程可以从第一个数据块中读取全部数据,可以从第二个数据块中读取全部数据,可以从第三个数据块中读取2k的数据。

另外,第二消息占用的第一个数据块的索引号对应的数据量为第二消息的数据量,除第一个数据块之外,第二消息占用的其它数据块的索引号对应的数据量为第二消息在数据块中实际存储数据的数据量,例如,第二消息为8k,数据块所能存储数据的数据量为3k,占用了3个数据块,在第一个数据块中写入3k的第二消息,在第二个数据块中写入3k的第二消息,在第三数据块中写入2k的第二消息,第一个数据块的索引号对应的数据量为8k,第二个数据块的索引号对应的数据量为3k,第三个数据块的索引号对应的数据量为2k。经过上述描述,在第二消息占用的每个数据块中读取第二消息时,可以在第一个数据块中读取出数据块所能存储数据的数据量,在除第一个数据块之外的其它数据块,可以使用其它数据块的索引号对应的数据量,分别在其它数据块中读取出相应数据量的数据。

另外,在本申请中,在每次从数据块中读取出数据后,可以将该数据块的数据进行擦除处理,这样,整个队列是环形的,在写偏移为最大的数据块的索引号时,再有写进程往消息队列中写入消息,该写进程可以从最小索引号的数据块开始,写入消息。这样,可以使消息队列重复使用。

本发明实施例中,由于在往消息队列中写入消息时,一个消息可以占用多个数据块,所以即使消息的数据量比较大,也不用将数据块所能存储数据的数据量设置的比较大,所以可以节约存储空间。

基于相同的技术构思,本发明实施例还提供了一种通信设备,如图5所示,该通信设备包括:

第一确定模块510,用于在将第一消息写入消息队列时,根据所述第一消息的数据量,确定所述第一消息占用所述消息队列中数据块的数目;

更新模块520,用于将所述消息队列对应的写偏移更新为当前对应所述消息队列存储的写偏移与所述数目之和,其中,所述写偏移用于指示当前已经写入数据的数据块的最大索引号;

第二确定模块530,用于根据更新后的写偏移和所述数目,确定所述第一消息占用所述消息队列中的数据块;

写入模块540,用于将所述第一消息写入确定出的数据块。

可选的,所述写入模块540,用于:

在所述消息队列中,按照确定出的数据块的索引号从大到小的顺序,依次将所述第一消息写入所述确定出的数据块。

可选的,所述更新模块520,还用于:

当所述确定出的数据块中第一数据块写入完成时,更新所述第一数据块的索引号对应的状态标识为完成标识。

可选的,如图6所示,所述通信设备还包括:

存储模块550,用于当所述确定出的数据块中第二数据块写入完成时,根据所述确定出的数据块的索引号,存储所述第二数据块的索引号对应的序号。

可选的,如图7所示,所述通信设备还包括:

创建模块560,用于创建消息队列,其中,所述消息队列包括头部区、读写监控区、索引区和数据区,所述读写监控区用于存储所述写偏移和读偏移,所述读偏移用于指示当前已经读出数据的数据块的最大索引号,所述数据区包括至少一个数据块。

本发明实施例中,由于在往消息队列中写入消息时,一个消息可以占用多个数据块,所以即使消息的数据量比较大,也不用将数据块所能存储数据的数据量设置的比较大,所以可以节约存储空间。

基于相同的技术构思,本发明实施例还提供了一种通信设备,如图8所示,该通信设备包括:

获取模块810,用于获取当前消息队列对应的读偏移和写偏移,其中,所述写偏移用于指示当前已经写入数据的数据块的最大索引号,所述读偏移用于指示当前已经读出数据的数据块的最大索引号;

确定模块820,用于如果所述读偏移小于所述写偏移,则根据所述读偏移,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量,并将所述读偏移更新为所述读偏移与确定出的数据块的数目之和;

读取模块830,用于根据所述第二消息的数据量,从所述确定出的数据块中,读取所述第二消息。

可选的,所述确定模块820,用于:

根据所述读偏移,确定与所述读偏移对应的数据块相邻的下一个数据块的索引号;

根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述确定模块820,用于:

获取所述索引号对应的状态标识,

如果所述状态标识是完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量;

如果所述状态标识不是完成标识,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述确定模块820,用于:

如果所述状态标识是完成标识,且所述索引号对应的序号为预设数值,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量;

所述确定模块,用于:

所述如果所述状态标识不是完成标识,且所述索引号对应的序号为预设数值,且在预设时长之内所述状态标识被更新为完成标识,则根据所述索引号,确定未读取第二消息占用所述消息队列中的数据块和所述第二消息的数据量。

可选的,所述确定模块820,还用于:

如果所述状态标识不是完成标识,且所述序号为所述预设数值,且在预设时长内所述状态标识未更新为完成标识,则放弃读取所述第二消息。

可选的,所述确定模块820,用于:

获取所述索引号对应的未读取第二消息的数据量;

根据所述第二消息的数据量,确定所述第二消息占用所述消息队列中数据块的数目;

根据所述索引号和所述数目,确定所述第二消息占用所述消息队列中的数据块。

本发明实施例中,由于在往消息队列中写入消息时,一个消息可以占用多个数据块,所以即使消息的数据量比较大,也不用将数据块所能存储数据的数据量设置的比较大,所以可以节约存储空间。

需要说明的是:上述实施例提供的通信设备在进行通信时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将通信设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的通信设备与进行通信的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图9是本发明实施例提供的一种服务器的结构示意图,该服务器900可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)901和一个或一个以上的存储器902,其中,所述存储器902中存储有至少一条指令,所述至少一条指令由所述处理器901加载并执行上述进行通信的方法的处理。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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