专利名称:处理异步消息队列的方法、系统和异步socket的制作方法
技术领域:
本发明涉及通信技术领域,具体的特别涉及一种处理异步消息队 列的方法、系统和异步SOCKET。
背景技术:
SOCKET (套接字)是一个通信链的句柄,用于描述IP地址和端 口 ,应用程序通常通过SOCKET向网络发出请求或者应答网络请求。 SOCKET在网络通信中的重要性越来越大,现有的BGP (边缘网关协 议)、LDP (标签分发协议)、OSPF (内部网关协议)、ISIS (链路状 态协议)等路由协议,以及TELNET (TCP/IP终端仿真协议)、FTP (文件传输协议)、HTTP (超文本传输协议)等网络传输协议都依托 于SOCKET提供的接口完成与底层之间的数据交互。现有路由协议通常采用异步SOCKET实现上层协议和底层之间 的数据承栽。异步SOCKET采用消息机制,这种消息机制在时间上将 数据与事件分离。现有异步消息队列的处理流程如图l所示 步骤101:异步SOCKET接收底层传输的数据。 底层传送到异步SOCKET的数据在被上层协议读取之前,存放于 该异步SOCKET的接收緩存中。步骤102:异步SOCKET向异步消息队列中写入异步读消息。 异步SOCKET将接收到的底层数据存放于接收緩存中,同时以写 读事件位的方式告知上层协议"有数据到达,,,同时将异步读消息写入 异步消息队列中。在异步SOCKET的实现中,SOCKET使用的异步消 息队列由路由管理器创建并维护,该异步消息队列的入口为SOCKET 的异步消息,出口为上层协议的读取。步骤103:上层协议从异步SOCKET接收緩存中读取数据。 上层协议接收并读取异步读消息后,可以根据该消息内的字段, 识别相应的异步SOCKET和与该异步SOCKET桂接的上层协议,若该异步SOCKET与当前上层协议匹配,则该上层协议调用异步 SOCKET的读取接口读取该异步SOCKET接收緩存中的数据。现有异步读消息上报示意图如图2所示其中,异步SOCKET在 接收到底层数据后,在异步SOCKET内部以异步读事件加异步读消息 的方式通知上层协议,上层协议确认异步读事件后,再读取异步读消 息,然后根据该消息的类型对读取的底层数据做相应的处理。图2中 异步SOCKET的异步消息队列操作与异步SOCKET接收到的数据一 一对应,即每接收到 一 次底层数据就相应的向异步消息队列中写入一 次异步读消息。现有的异步消息队列处理方法,以及异步事件消息的上报机制虽 然清晰地表达了 "接收数据-通知协议"的过程,但在实际应用中, 这种机制会引发大量的空闲异步读消息占用异步消息的队列资源,特 别当异步SOCKET接收数据频繁时尤其突出。首先,由于异步SOCKET频繁接收来自底层的报文数据,同时向 异步消息队列中写入大量的异步读消息,当网络中路由协议在初始导 入大量路由,或者当网络中产生路由振荡时,若上层协议处理相应报 文数据的速度稍微减慢,则极有可能造成异步消息队列中的资源爆满, 从而导致异步SOCKET丢失报文数据。其次,上层路由协议在接收到异步SOCKET写入的一个异步读消 息时, 一次读完异步SOCKET接收緩存。当异步SOCKET连续接收 完几个底层报文数据,并写入相应多的异步读消息,而上层路由协议 在得到第 一个异步读消息时,就一次性读完了异步SOCKET接收援存 中的所有报文数据,则剩下的异步读消息就会触发大量的上层路由协 议空读。再次,当多个上层路由协议与异步SOCKET建立连接时,每个路 由协议都会产生大量的异步读消息。在一个时间范围内,异步消息队 列被其中 一部分路由协议的消息占据,剩余的路由协议由于异步消息 队列已满而无法成功写消息。在这种情况下若丢弃报文就会造成路由 数据丢失;若尽最大可能保留报文数据,则由于长时间无法写异步读消息,当异步SOCKET接收緩存满后,就再也不会通知异步读消息, 从而造成异步SOCKET中的緩存堆积。发明内容本发明的实施例提供 一 种处理异步消息队列的方法,以解决现有 技术中由于重复向异步消息队列中写入异步读消息,容易造成异步消 息队列中资源爆满,异步读消息触发大量的上层路由协议空读, S O C KE T丢失报文数据,从而导致网络中路由信息丢失的问题。本发明的另 一 实施例提供 一 种处理异步消息队列的系统,以解决 现有技术中重复向异步消息队列中写入异步读消息,容易造成队列中 资源爆满,报文丢失的问题。本发明的又一实施例提供一种异步SOCKET,以解决现有技术中 异步SOCKET重复向异步消息队列中写入异步读消息的问题。为解决上述问题,本发明的实施例提供如下技术方案一种处理异步消息队列的方法,包括步骤A、 异步SOCKET将接收到的底层数据放入接收緩存,判断异步 消息队列中是否有未读取的异步读消息,如果异步消息队列中没有未 读取的异步读消息,则向所述异步消息队列中写入一异步读消息,执行步骤B,如果异步消息队列中有未读取的异步读消息,则执行步骤 B;B、 上层协议读取异步消息队列中的异步读消息后,从异步 SOCKET接收緩存中读取底层数据。一种处理异步消息队列的系统,所述系统包括底层数据模块、 上层协议模块以及连接底层数据模块和上层协议模块的异步SOCKET 模块,所述异步SOCKET模块包括接收緩存模块,接收并存放所述底层数据模块发送的数据; 判断异步读消息模块,用于判断异步消息队列中是否有未读取的 异步读消息;消息时,向所述异步消息队列中写入一异步读消息; 所述上层协议模块包括读异步读消息模块,用于读取所述异步消息队列中写入的异步读 消息;读取数据模块,用于从所述接收緩存模块中读取底层数据。 一种异步SOCKET,包括 接收緩存模块,用于存放接收到的底层数据; 判断异步读消息模块,用于判断异步消息队列中是否有未读取的 异步读消息;写异步读消息模块,用于当异步消息队列中没有未读取的异步读 消息时,向所述异步消息队列中写入一异步读消息。由以上本发明提供的实施例可见,本发明异步SOCKET在一段时 间内连续接收到底层数据后,只向异步消息队列中写入 一 个异步读消 息,当多个上层路由协议与异步SOCKET建立连接时,由于每个上层 路由协议只对应各自写入的一个异步读消息,因此极大减少了异步读 消息对异步消息队列空间的占用,提高了上层协议处理相应报文数据 的速度,不会造成异步消息队列中资源的浪费,避免了初始导入大量 路由或者路由振荡时,因异步消息队列满载而丟失数据的情况发生, 提高了网络中路由器的处理效率,增强了网络的健壮性。附困说明图l为现有技术中处理异步消息队列的流程图;图2为现有技术中异步读消息上报示意图;图3为本发明处理异步消息队列的方法流程图;图4为本发明第一实施例流程图;图5为本发明异步读消息上报示意图;图6本发明第二实施例流程图;图7本发明第三实施例流程图;图8本发明第四实施例流程图;图9为本发明处理异步消息队列系统的框图;
图10为本发明异步SOCKET—个实施例的框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面结合附图 和实施方式对本发明作进一步的详细说明。在异步SOCKET的实现过程中,异步SOCKET使用的异步消息 队列由路由管理器创建和维护,该异步消息队列的入口为异步 SOCKET的异步读消息,出口为上层协议的读取。当异步SOCKET从 底层接收到数据后,将数据桂栽在接收緩存中,在该异步SOCKET调 用异步消息队列的过程中要分别进行异步读事件和异步读消息的处 理。其中,异步读事件是在调用异步消息队列写操作中,对相应任务 的读事件位置位;异步读消息是一个结构体,记录了相应的异步 SOCKET和任务信息,当异步SOCKET接收到底层数据后,在异步读 事件位置位后,将该异步读消息写入异步消息队列中,供上层协议获 取该异步读消息并执行相应的任务。本发明处理异步消息队列的方法流程如图3所示步骤301:异步SOCKET将接收到的底层数据放入接收緩存,判 断异步消息队列中是否有未读取的异步读消息,如果异步消息队列中 没有未读取的异步读消息则向该异步消息队列中写入一异步读消息, 执行步骤302,如果异步消息队列中有未读取的异步读消息则执行步 骤302;具体的,在判断异步消息队列中是否有未读取的异步读消息时, 异步SOCKET设置一个合并标志计数器,初始设置该合并标志计数器 时,将所述计数器设为预设值,该预设值一般设置为零,也可设置为 其他值,后面的实施例中均以零为例进行描述。当该异步SOCKET接 收到一次数据后,判断该合并标志计数器的计数是否为预设值,若为 预设值则表示异步消息队列中没有未读取的异步读消息,否则,表示 异步消息队列中有未读取的异步读消息;判断结束后将该计数器的预 设值加一,或者将该计数器的预设值减一。步骤302:上层协议读取异步消息队列中的异步读消息后,从异步SOCKET接收緩存中读取底层数据。当初始设置的上层协议数据緩存与异步SOCKET接收緩存长度 一致时,上层协议读取该一个异步读消息后,从异步SOCKET接收緩 存中一次读尽底层数据;当初始设置的上层协议数据緩存小于异步 SOCKET接收緩存长度时,上层协议设置一个内存空间申请緩存,当 上层协议从异步SOCKET接收緩存中读取一次底层数据后,根据接收 緩存中剩余底层数据的长度,向内存空间申请緩存申请一段与该剩余 底层数据长度相等的扩展数据緩存用于读取异步SOCKET接收緩存 中的剩余底层数据。当上层协议未能读尽异步SOCKET接收緩存中的底层数据时,通 过向异步消息队列中自激性写入一异步读消息,以使上层协议将接收 緩存中的底层数据读尽,这里自激性写入表示接收緩存中有未读取尽 的底层数据时,上层协议自发地向异步消息队列中写入异步读消息以 使上层协议进一步读尽底层数据。具体的,当上层协议为数据流协议 时,该上层协议读取底层数据后,异步SOCKET判断接收緩存中的底 层数据是否被读尽;若是,则该异步SOCKET向异步消息队列中写入 一异步读消息促使上层协议继续读取底层数据,否则,结束异步读消 息的上报流程;当上层协议为数据报协议时,该上层协议读取底层数 据后,异步SOCKET记录准备向异步消息队列中写入的异步读消息, 当该异步SOCKET在预制时间内没有接收到新的底层数据时,该异步 SOCKET向异步消息队列中写入前述记录的异步读消息,以促使上层 协议继续读取底层数据,通常该预制时间一般不超过500毫秒。本发明第一实施例的流程图如图4所示,该实施例示出了上层协 议将异步SOCKET接收緩存中的底层数据 一 次读尽的处理流程步骤401:异步SOCKET设置合并标志计数器。异步SOCKET初始设置合并标志计数器的计数为零,设置的合并 标志计数器主要用于判断异步消息队列中是否有未读取的异步读消 台步骤402:异步SOCKET将在一段时间(优选一个报文时间)内接收到的底层数据放入接收緩存。步骤403:判断合并标志计数器的计数是否为零,若是,则执行 步骤404;否则,转到步骤405。步骤404:异步S OCKET向异步消息队列中写入 一 个异步读消息。步骤405:异步SOCKET将合并标志计数器的计数加一。步骤406:上层协议读取异步消息队列中的异步读消息后从接收 緩存中读尽底层数据。若初始设置的上层协议数据緩存与异步SOCKET接收緩存长度 一致,当上层协议读取异步SOCKET接收緩存中的底层数据时,无论 该接收緩存中的数据满或不满,上层协议的数据緩存都可以容纳所读 取的底层数据。步骤407:将合并标志计数器清零,结束流程。本发明中异步读消息上报的示意图如图5所示,图中异步 SOCKET在一段时间内(优选一个报文时间)连续接收到底层数据后, 将接收底层数据相应的异步读消息合并为一个异步读消息后,写入异 步消息队列中供上层协议读取。异步SOCKET在一个报文时间内接收 到五个底层数据,这五个底层数据分别触发相应的写读消息事件后, 在向异步消息队列中写入异步读消息请求上层协议读取底层数据时, 将原本需要分别写入的五个异步读消息进行合并,即在一个报文时间内无论接收到多少个底层数据,都只向异步消息队列中写入一个异步 读消息。上层协议可以为异步SOCKET设置接口和函数完成本发明实 施例的异步读消息合并上报。当上层协议为异步SOCKET设置完该接口函数后,该异步 SOCKET内部就会实施合并异步读消息的操作,而上层协议无需进行 相应读取流程上的 <奮改。本发明第二实施例的流程如图6所示,该实施例示出了上层协议 将异步S O CKE T接收緩存中的底层数据 一 次读尽的另 一 种处理流程步骤601:异步SOCKET设置合并标志计数器。异步SOCKET初始设置合并标志计数器时,将该计数器置零,这里设置的合并标志计数器主要用于判断异步消息队列中是否有未读取 的异步读消息。步骤602:异步SOCKET将在一段时间(优选一个净艮文时间)内 接收到的底层数据放入接收緩存。步骤603:判断合并标志计数器的计数是否为零,若是,则执行 步骤604;否则,转到步骤605。步骤604:异步SOCKET向异步消息队列中写入 一 个异步读消息。步骤605:异步SOCKET将合并标志计数器的计数加一。步骤606:设置上层协议的内存空间申请緩存。若初始设置的上层协议数据緩存小于异步SOCKET接收緩存长 度,则在上层协议中设置一个内存空间申请緩存,当上层协议读取一 次异步SOCKET接收緩存中的底层数据后,可以根据接收緩存中剩余 底层数据的长度灵活地申请上层协议中的扩展数据緩存,使扩展数据 緩存正好可以将异步SOCKET接收緩存中的底层数据读尽,这样不仅 保证了底层数据可以被读尽,而且不会浪费上层协议中的数据緩存空 间。步骤607:上层协议读取异步消息队列中的异步读消息后从异步 SOCKET接收緩存中读取底层数据。步骤608:上层协议通过内存空间申请緩存申请与接收緩存中剩 余数据长度相等的扩展数据緩存。步骤609:上层协议应用扩展数据緩存读取接收緩存中的剩余底 层数据。步骤610:将合并标志计数器清零,结束流程。由于某些上层协议无法在一个报文处理时间内读完异步SOCKET 接收緩存中的底层数据,因此需要SOCKET自激性的向异步消息队列 中写入异步读消息,触发上层协议继续读取接收緩存中的底层数据, 直至接收緩存中的底层数据全部被上层协议读尽。针对不同的上层协议采用不同的运输层协议而造成的读取异步 SOCKET接收緩存中底层数据的流程差异,为了保证异步SOCKET在得知上层协议没有读取完接收緩存中的底层数据时,能在最短时间内 自激性的向异步消息队列中写入用于通知上层协议的异步读消息,则 要针对不同的上层协议进行相应的自激流程处理。本发明第三实施例的流程如图7所示,该实施例示出了当上层协 议为数据流协议,且该上层协议没有将异步SOCKET接收緩存中的底 层数据一次读尽时的处理流程,其中,数据流协议主要包括TCP (传 输控制协议)步骤701:异步SOCKET设置合并标志计数器。异步SOCKET初始设置合并标志计数器时,将该计数器置零,这 里设置的合并标志计数器主要用于判断异步消息队列中是否有未读取 的异步读消息。步骤702:异步SOCKET将在一段时间(优选一个报文时间)内 接收到的底层数据放入接收緩存中。步骤703:判断合并标志计数器的计数是否为零,若是,则执行 步骤704;否则,转到步骤705。步骤704:异步SOCKET向异步消息队列中写入 一 个异步读消息。步骤705:异步SOCKET将合并标志计数器的计数加一。步骤706:上层协议读取异步消息队列中的异步读消息后从异步 SOCKET的接收緩存中读取底层数据。步骤707:判断异步SOCKET接收緩存中的底层数据是否被读尽, 若是,则执行步骤709;否则,执行步骤708。步骤708:异步SOCKET向异步消息队列中自激写入一个异步读 消息,然后返回步骤706。步骤709:将合并标志计数器的计数清零,结束流程。本发明第四实施例的流程如图8所示,该实施例示出了当上层协 议为数据报协议,且该上层协议没有将异步SOCKET接收緩存中的底 层数据一次读尽的处理流程,其中,数据报协议主要包括UDP (用户 数据报协议),RAWIP (原IP协议),RAWLINK (原链路协议)步骤801:异步SOCKET设置合并标志计数器。异步SOCKET初始设置合并标志计数器时,将该计数器置零,这 里设置的合并标志计数器主要用于判断异步消息队列中是否有未读取 的异步读消息。步骤802:异步SOCKET将在一段时间(优选一个报文时间)内接收到的底层数据放入接收緩存中。步骤803:判断合并标志计数器的计数是否为零,若是,则执行步骤804;否则,转到步骤805。步骤804:异步SOCKET向异步消息队列中写入一个异步读消息。步骤805:异步SOCKET将合并标志计数器的计数加一。步骤806:上层协议读取异步消息队列中的异步读消息后从异步SOCKET的接收緩存中读取底层数据。步骤807:异步SOCKET记录准备向异步消息队列写入的异步读消息。当上层协议为数据报协议时,异步SOCKET不实时自激写入异步 读消息,而是先记录准备向异步消息队列中写入的异步读消息,但该 过程中允许新的报文数据相应执行向异步消息队列中写异步读消息的 操作。步骤808:判断异步SOCKET在预制时间(例如500毫秒)内是 否接收到新的底层数据,若是,则执行步骤810;否则,执行步骤809。 步骤809:异步SOCKET向异步消息队列中自激写入一个异步读 消息,然后返回步骤806。步骤810:将合并标志计数器的计数清零,结束流程。 本发明处理异步消息队列系统的框图如图9所示 该系统包括底层数据模块S1,用于向异步SOCKET模块发送 底层数据;异步SOCKET模块S2,用于接收底层数据后向异步消息 队列中写入异步读消息;上层协议模块S3,用于读取异步读消息后从 异步SOCKET模块中读取底层数据。异步SOCKET模块S2包括接收緩存模块S21,用于接收并存放 一段时间(优选一个报文时间)内底层数据模块发送的数据;判断异步读消息模块S22,用于判断异步消息队列中是否有未读取的异步读 消息;写异步读消息模块S23,用于当异步消息队列中没有未读取的 异步读消息时,向异步消息队列中写入一异步读消息,还可以用于当 异步SOCKET接收緩存中的底层数据未被上层协议读尽时,向异步消 息队列中自激写入一异步读消息;自激异步读消息模块S24,用于当 异步SOCKET接收緩存中的底层数据未被上层协议读尽时,向异步消 息队列中写入一异步读消息。其中,判断异步读消息模块S22包括设置计数器模块S221,用于 在异步SOCKET中设置合并标志计数器;判断计数器模块S222,通 过合并标志计数器的计数判断异步消息队列中是否有未读取的异步读 消息;操作计数器模块S223,用于将合并标志计数器的计数值加一或 减一;重置计数器模块S224,用于当读取数据模块从接收緩存中读取 数据后,将合并标志计数器重置为预设值。其中,自激异步读消息模块S24包括判断上层协议模块S241,用 于判断上层协议为数据流协议,或为数据报协议;判断数据读取模块 S242,用于当上层协议为数据流协议时,上层协议读取接收緩存模块 中的底层数据后,判断接收緩存模块中的底层数据是否被读尽;重复 写异步读消息模块S243,与判断数据读取模块相连,用于当接收緩存 模块中的底层数据未被上层协议读尽时,向异步消息队列中写入一异 步读消息;緩存异步读消息模块S244,用于当上层协议为数据报协议 时,当数据读取模块读取接收緩存模块中的底层数据后,记录准备向 异步消息队列中写入的异步读消息;判断接收数据模块S245,与緩存 异步读消息模块相连,用于在预制时间内(一般为500毫秒)接收緩 存模块没有接收到新的底层数据时,向异步消息队列中写入记录的异 步读消息。上层协议模块S3包括读取异步读消息模块S31,用于读取异步消 息队列中写入的一个异步读消息,还可以用于读取自激写入的一异步 读消息;读取数据模块S32,用于从接收緩存模块中读取底层数据, 还可以用于从异步SOCKET接收緩存中读取剩余的底层数据;重复读取异步读消息模块S33,用于读取自激异步读消息模块向异步消息队 列中写入的一异步读消息;重复读取数据模块S34,用于从异步 SOCKET接收緩存中读取剩余的底层数据。其中,读取数据模块S32包括判断数据緩存模块S321,用于判断 初始设置的上层协议数据緩存与异步SOCKET接收緩存长度是否一 致;读尽数据模块S322,用于当判断数据緩存模块判断初始设置的上 层协议数据緩存与异步SOCKET接收緩存长度一致时,从异步 SOCKET接收緩存中一次读尽底层数据;设置申请緩存模块S323,用 于当判断数据緩存模块判断初始设置的上层协议数据緩存小于异步 SOCKET接收緩存长度时,在上层协议中设置 一个内存空间申请緩存; 一次读取数据模块S324,用于根据上层协议数据緩存的长度从异步 SOCKET接收緩存中读取一次底层数据;申请扩展緩存空间模块 S325,用于向设置申请緩存模块申请一段与异步SOCKET接收緩存中 剩余数据长度相等的扩展数据緩存;二次读取数据模块S326,用于通 过扩展数据緩存读尽异步SOCKET接收緩存中的剩余数据。利用本发明系统处理异步消息队列的详细过程与前面对本发明方 法的描述类似,在此不再赘述。本发明异步SOCKET的一个实施例框图如图IO所示该异步SOCKET包括接收緩存模块S41,用于接收并存放一段 时间(优选一个报文时间)底层数据模块发送的数据;判断异步读消 息模块S42,用于判断异步消息队列中是否有未读取的异步读消息; 写异步读消息模块S43,用于当异步消息队列中没有未读取的异步读 消息时,向异步消息队列中写入一异步读消息,还可以用于当异步 SOCKET接收緩存中的底层数据未被上层协议读尽时,向所述异步消 息队列中自激写入一异步读消息;自激异步读消息模块S44,用于当 异步SOCKET接收緩存中的底层数据未被上层协议读尽时,向异步消 息队列中写入一异步读消息。其中,判断异步读消息模块S42包括设置计数器模块421,用于 在异步SOCKET中设置合并标志计数器;判断计数器模块S422,通过合并标志计数器的计数判断异步消息队列中是否有未读取的异步读消息;操作计数器模块S423,用于将合并标志计数器的计数值加一或 减一;重置计数器模块S424,用于当上层协议从接收緩存中读取数据 后,将合并标志计数器重置为预设值。其中,自激异步读消息模块S44包括判断上层协议模块S441,用 于判断上层协议为数据流协议,或为数据报协议;判断数据读取模块 S442,用于当上层协议为数据流协议时,上层协议读取接收緩存模块 中的底层数据后,判断接收緩存模块中的底层数据是否被读尽;重复 写异步读消息模块S443,与判断数据读取模块相连,用于当接收緩存 模块中的底层数据未被上层协议读尽时,向异步消息队列中写入一异 步读消息;緩存异步读消息模块S444,用于当上层协议为数据报协议 时,当数据读取模块读取接收緩存模块中的底层数据后,记录准备向 异步消息队列中写入的异步读消息;判断接收数据模块S445,与緩存 异步读消息模块相连,用于在预制时间内接收緩存模块没有接收到新 的底层数据时,向异步消息队列中写入记录的异步读消息。利用本发明异步SOCKET对异步消息队列进行处理,其详细过程 与前面对本发明方法的描述类似,在此不再赘述。由以上对本发明实施例的描述可知,由于在一段时间内异步 SOCKET仅向异步消息队列中写入一异步读消息,上层协议只会到接 收緩存中读取一次底层数据,因此网络中不会出现上层路由协议空读 异步SOCKET接收緩存的情况,极大提高了上层协议读取底层数据的 性能。当异步SOCKET接收緩存中的底层数据没有一次被读尽时,通过 自激方式向异步消息队列中写入 一 异步读消息,触发上层协议将剩余 的底层数据读尽,因此不会造成异步SOCKET中的接收緩存堆积。虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发 明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包 括这些变形和变化而不脱离本发明的精神。
权利要求
1. 一种处理异步消息队列的方法,其特征在于,包括步骤A、异步SOCKET将接收到的底层数据放入接收缓存,判断异步消息队列中是否有未读取的异步读消息,如果异步消息队列中没有未读取的异步读消息,则向所述异步消息队列中写入一异步读消息,执行步骤B,如果异步消息队列中有未读取的异步读消息,则执行步骤B;B、上层协议读取异步消息队列中的异步读消息后,从异步SOCKET接收缓存中读取底层数据。
2、 根据权利要求1所述的方法,其特征在于,所述判断异步消 息队列中是否有未读取的异步读消息的方法为判断一合并标志计数 器的计数是否为 一预设值,若为所述预设值则异步消息队列中没有未 读取的异步读消息;否则,异步消息队列中有未读取的异步读消息;判断异步消息队列中是否有未读取的异步读消息之后将所述合 并标志计数器的计数值加 一 或减一 。
3、 根据权利要求2所述的方法,其特征在于,所述步骤B中上 层协议读取异步SOCKET接收緩存中的底层数据后所述合并标志计 数器将其计数重置为所述预设值。
4、 根据权利要求1所述的方法,其特征在于,所述步骤B包括 上层协议设置 一 个内存空间申请緩存;上层协议读取所述异步读消息后,根据上层协议数据緩存的长度 从异步SOCKET接收緩存中读取一次底层数据;上层协议根据所述异步SOCKET接收緩存中剩余数据长度,向所 述内存空间申请緩存申请一段与所述剩余数据长度相等的扩展数据緩 存;上层协议应用所述扩展数据緩存读尽所述异步SOCKET接收緩 存中的剩余底层数据。
5、 根据权利要求1所述的方法,其特征在于,若所述步骤B中 上层协议不能一次读尽异步SOCKET接收緩存中的底层数据,所述方 法还包括C、 异步SOCKET向所述异步消息队列中自激性写入一异步读消息D、 返回步骤B,直至上层协议将所述异步SOCKET接收緩存中 的底层数据读尽。
6、 根据权利要求5所述的方法,其特征在于,所述上层协议为 数据流协议,所述步骤C包括上层协议读取异步SOCKET接收緩存中的底层数据后,该异步 SOCKET判断接收緩存中的底层数据是否被读尽;若是,则所述异步SOCKET向异步消息队列中写入一异步读消息;否 则,结束异步读消息的上报。
7、 根据权利要求5所述的方法,其特征在于,所述上层协议为 数据报协议,所述步骤C包括上层协议读取异步SOCKET接收緩存中的底层数据后,该异步 SOCKET记录准备向异步消息队列中写入的异步读消息;当所述异步SOCKET在预制时间内没有接收到新的底层数据时, 该异步SOCKET向异步消息队列中写入所述记录的异步读消息。
8、 一种处理异步消息队列的系统,所述系统包括底层数据模 块、上层协议模块以及连接底层数据模块和上层协议模块的异步 SOCKET模块,其特征在于,所述异步SOCKET模块包括接收緩存模块,接收并存放所述底层数据模块发送的数据;判断异步读消息模块,用于判断异步消息队列中是否有未读取的异步读消息;写异步读消息模块,用于当异步消息队列中没有未读取的异步读消息时,向所述异步消息队列中写入一异步读消息; 所述上层协议模块包括读异步读消息模块,用于读取所述异步消息队列中写入的异步读消息;读取数椐模块,用于从所述接收緩存模块中读取底层数据。
9、 根据权利要求8所述的系统,其特征在于,所述判断异步读 消息模块包括设置计数器模块,用于在异步SOCKET中设置合并标志计数器; 判断计数器模块,通过所述合并标志计数器的计数判断异步消,t, 队列中是否有未读取的异步读消息;操作计数器模块,用于将所述合并标志计数器的计数值加一或减重置计数器模块,用于当读取数据模块从接收緩存中读取数据 后,将所述合并标志计数器重置为预设值。
10、 根据权利要求8所述的系统,其特征在于,所述读取数据模 块包括判断数据緩存模块,用于判断初始设置的上层协议数据緩存与异 步SOCKET接收緩存长度是否一致;读尽数据模块,用于当判断数据緩存模块判断初始设置的上层协 议数据緩存与异步SOCKET接收緩存长度一致时,从异步SOCKET 接收緩存中 一 次读尽底层数据;设置申请緩存模块,用于当判断数据緩存模块判断初始设置的上 层协议数据緩存小于异步SOCKET接收緩存长度时,在上层协议中设 置一个内存空间申请緩存;一次读取数据模块,用于根据上层协议数据緩存的长度从异步 SOCKET接收緩存中读取一次底层数据;申请扩展緩存空间模块,用于向所述设置申请緩存模块申请一段 与异步SOCKET接收緩存中剩余数据长度相等的扩展数据緩存;二次读取数据模块,用于通过所述扩展数据緩存读尽所述异步 SOCKET接收緩存中的剩余数据。
11、 根据权利要求8所述的系统,其特征在于, 所述写异步读消息模块进一步用于当异步SOCKET接收緩存中的底层数据未被上层协议读尽时,向所述异步消息队列中自激写入一 异步读消息;所述读异步读消息模块进一步用于读取所述自激写入的异步读消息;所述读取数据模块进一步用于从异步SOCKET接收緩存中读取剩余的底层数据。
12、根据权利要求8所述的系统,其特征在于, 所述异步SOCKET模块还包括自激异步读消息模块,用于当异步SOCKET接收緩存中的底层数 据未被上层协议读尽时,向所述异步消息队列中自激写入一异步读消息;所述自激异步读消息模块包括判断上层协议模块,用于判断上层协议为数据流协议,或为数据 报协议;判断数据读取模块,当上层协议为数据流协议时,用于上层协议 读取接收緩存模块中的底层数据后,判断接收緩存模块中的底层数据 是否被读尽;重复写异步读消息模块,与判断数据读取模块相连,用于当接收 緩存模块中的底层数据未被上层协议读尽时,向异步消息队列中写入 一异步读消息;緩存异步读消息模块,当上层协议为数据报协议时,用于当数据 读取模块读取接收緩存模块中的底层数据后,记录准备向异步消息队 列中写入的异步读消息;判断接收数据模块,与緩存异步读消息模块相连,用于在预制时 间内所述接收緩存模块没有接收到新的底层数据时,向异步消息队列 中写入所述记录的异步读消息。所述上层协议模块还包括重复读取异步读消息模块,用于读取所述自激异步读消息模块向 异步消息队列中写入的异步读消息;重复读取数据模块,用于从异步SOCKET接收緩存中读取剩余的 底层数据。
13、 一种异步SOCKET,其特征在于,包括 接收緩存模块,用于存放接收到的底层数据;判断异步读消息模块,用于判断异步消息队列中是否有未读取的 异步读消息;写异步读消息模块,用于当异步消息队列中没有未读取的异步读 消息时,向所述异步消息队列中写入一异步读消息。
14、 根据权利要求13所述的异步SOCKET,其特征在于,所述 判断异步读消息模块包括设置计数器模块,用于在异步SOCKET中设置合并标志计数器; 判断计数器模块,通过所述合并标志计数器的计数判断异步消,t、 队列中是否有未读取的异步读消息;操作计数器模块,用于将所述合并标志计数器的计数值加一或减重置计数器模块,用于当上层协议从接收緩存中读取数据后,将 所述合并标志计数器重置为预设值。
15、 根据权利要求13所述的异步SOCKET,其特征在于, 所述写异步读消息模块进一步用于当异步SOCKET接收緩存中的底层数据未被上层协议读尽时,向所述异步消息队列中自激写入一 异步读消息。
16、 根据权利要求13所述的异步SOCKET,其特征在于,所述 异步SOCKET还包括自激异步读消息模块,用于当异步SOCKET接收緩存中的底层数 据未被上层协议读尽时,向所述异步消息队列中自激写入一异步读消息;所述自激异步读消息模块包括判断上层协议模块,用于判断上层协议为数据流协议,或为数据 报协议;判断数椐读取模块,当上层协议为数据流协议时,用于上层协议 读取接收緩存模块中的底层数据后,判断接收緩存模块中的底层数据是否被读尽;重复写异步读消息模块,与判断数据读取模块相连,用于当接收 緩存模块中的底层数据未被上层协议读尽时,向异步消息队列中写入 一异步读消息;緩存异步读消息模块,当上层协议为数据报协议时,用于当数据 读取模块读取接收緩存模块中的底层数据后,记录准备向异步消息队 列中写入的异步读消息;判断接收数据模块,与緩存异步读消息模块相连,用于在预制时 间内所述接收緩存模块没有接收到新的底层数据时,向异步消息队列 中写入所述记录的异步读消息。
全文摘要
本发明公开了一种处理异步消息队列的方法,包括步骤A.异步SOCKET将接收到的底层数据放入接收缓存,判断异步消息队列中是否有未读取的异步读消息,如果异步消息队列中没有未读取的异步读消息则向所述异步消息队列中写入一异步读消息,执行步骤B,如果异步消息队列中有未读取的异步读消息,则执行步骤B;B.上层协议读取所述异步读消息后,从异步SOCKET接收缓存中读取底层数据。本发明还公开了一种处理异步消息队列的系统和一种异步SOCKET。应用本发明减少了异步读消息对异步消息队列空间的占用,提高了上层协议处理相应报文数据的速度,避免了初始导入大量路由或者路由振荡时,因异步消息队列满载而丢失数据的情况发生。
文档编号H04L29/06GK101247319SQ20071007939
公开日2008年8月20日 申请日期2007年2月16日 优先权日2007年2月16日
发明者辉 倪, 庄顺万, 飒 肖, 霞 陈 申请人:华为技术有限公司