消息文件管理方法及装置转让专利

申请号 : CN200910077294.7

文献号 : CN101783740B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 徐凡

申请人 : 大唐移动通信设备有限公司

摘要 :

本发明公开了一种消息文件管理方法及装置,所述方法包括:建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件,并将所述文件系统映射到内存;当需要写消息时,选择所述文件系统中的节点目录;将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息。利用本发明,能够快速定位文件中的消息,提高文件中消息队列的管理效率。

权利要求 :

1.一种消息文件管理方法,其特征在于,包括:

建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件,所述节点目录下的头文件包括数据块开关映射表和索引节点列表;所述数据文件包括数据块,并将所述文件系统映射到内存;

当需要写消息时,选择所述文件系统中的节点目录;

根据所述节点目录下的数据块开关映射表选择所述数据文件中空闲的数据块;

根据内存中的索引开关选择所述索引节点列表中空闲的索引节点;

将所述消息的内容写入所述空闲的数据块中,并在所述空闲的索引节点中写入所述消息的相关信息。

2.根据权利要求1所述的方法,其特征在于,所述选择所述文件系统中的节点目录包括:根据哈希算法确定所述节点目录。

3.根据权利要求1所述的方法,其特征在于,所述方法还包括:将所述消息写入内存队列;

当需要读取消息时,根据消息标识从所述内存队列中读取消息。

4.根据权利要求1所述的方法,其特征在于,所述方法还包括:建立消息标识与文件对象的对应关系,所述文件对象包括以下信息:选择的节点目录、所述消息内容写入的数据块、所述消息的相关信息写入的索引节点;

当需要删除消息时,根据所述消息标识与文件对象的对应关系,确定与所述消息相关的数据块和索引节点;

删除所述数据块中的内容,并更新所述数据块对应的数据块开关映射表中的开关状态及所述索引节点对应的内存中的索引开关状态。

5.一种消息文件管理装置,其特征在于,包括:

文件建立单元,用于建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件,所述节点目录下的头文件包括数据块开关映射表和索引节点列表,所述数据文件包括数据块;

映射单元,用于将所述文件系统映射到内存;

消息写入单元,用于当需要写消息时,选择所述文件系统中的节点目录,并将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息;所述消息写入单元包括:节点目录选择子单元,用于利用哈希算法确定所述节点目录;

数据块选择子单元,用于根据所述节点目录下的数据块开关映射表选择所述数据文件中空闲的数据块;

索引节点选择子单元,用于根据内存中的索引开关选择所述索引节点列表中空闲的索引节点;

写入子单元,用于将所述消息的内容写入所述空闲的数据块中,并在所述空闲的索引节点中写入所述消息的相关信息。

6.根据权利要求5所述的装置,其特征在于,还包括:队列写入单元,用于将所述消息写入内存队列。

7.根据权利要求6所述的装置,其特征在于,还包括:消息读取单元,用于当需要读取消息时,根据消息标识从所述内存队列中读取消息。

8.根据权利要求5所述的装置,其特征在于,还包括:映射表建立单元,用于建立消息标识与文件对象的对应关系,所述文件对象包括以下信息:选择的节点目录、所述消息内容写入的数据块、所述消息的相关信息写入的索引节点;

消息删除子单元,用于当需要删除消息时,根据所述消息标识与文件对象的对应关系,确定与所述消息相关的数据块和索引节点;更新所述数据块对应的数据块开关映射表中的开关状态及所述索引节点对应的内存中的索引开关状态。

说明书 :

消息文件管理方法及装置

技术领域

[0001] 本发明涉及网络管理技术,具体涉及一种消息文件管理方法及装置。

背景技术

[0002] 在电信的网管应用系统中,需要对现网中的网元设备运维数据和网管系统进行大数据量的消息动态同步,如何保证这些同步的消息安全持久并能快速定位某消息,会对整个网管系统的运行性能、执行效率和准确性起到至关重要的影响。
[0003] 大多数网管系统中对消息的读写一般都是基于内存或一般的文件系统的读写,大致可以分为:基于内存的方式、基于文件的方式和基于数据库的方式。
[0004] 在基于文件的方式的消息读写中也有多种形式,在实现本发明的过程中,发明人发现现有的基于文件方式的消息读写中至少存在以下问题:
[0005] (1)现有的无格式文件和随机存取文件的读写速度慢,无法快速定位消息。
[0006] (2)缓冲输入流文件读写速度较快,但是只能顺序进行,很难定位和控制文件中的消息。
[0007] (3)内存映射文件虽然读写速度较快,但很难定位和控制文件中的消息。这显然很难保证系统运行的效率和准确性。

发明内容

[0008] 本发明实施例提供一种消息文件管理方法及装置,能够快速定位文件中的消息,提高文件中消息队列的管理效率。
[0009] 为此,本发明实施例提供如下技术方案:
[0010] 本发明实施例提供的一种消息文件管理方法,包括:
[0011] 建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件,并将所述文件系统映射到内存;
[0012] 当需要写消息时,选择所述文件系统中的节点目录;
[0013] 将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息。
[0014] 本发明实施例提供的一种消息文件管理装置,包括:
[0015] 文件建立单元,用于建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件;
[0016] 映射单元,用于将所述文件系统映射到内存;
[0017] 消息写入单元,用于当需要写消息时,选择所述文件系统中的节点目录,并将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息。
[0018] 本发明实施例的消息文件管理方法及装置,通过建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件;将所述文件系统映射到内存;当需要写消息时,选择所述文件系统中的节点目录;将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息。通过内存映射方式,利用内存缓存部分文件系统的内容,大大提高了文件队列的访问速度。尤其是对于电信的网管应用系统,可以快速定位消息队列中的消息,保证系统运行的实时性、有效性和准确性。

附图说明

[0019] 图1是本发明实施例消息文件管理方法的流程图;
[0020] 图2是本发明实施例中文件系统的存储示意图;
[0021] 图3是本发明实施例中根目录下的Head文件的一种结构示意图;
[0022] 图4是本发明实施例中节点目录下的Head文件的一种结构示意图;
[0023] 图5是本发明实施例中节点目录下的Head文件中的超级块的结构示意图;
[0024] 图6是本发明实施例中节点目录下的Data文件的一种结构示意图;
[0025] 图7是本发明实施例消息文件管理装置的结构示意图。
[0026] 具体实施方式
[0027] 为了使本技术领域的人员更好地理解本发明实施例的方案,下面结合附图和实施方式对本发明实施例作进一步的详细说明。
[0028] 本发明实施例的消息文件管理方法及装置,利用操作系统缓存的模式,将消息文件映射到内存中,这样访问消息文件中的消息队列就像访问内存一样快速和方便。具体地,首先建立一个文件系统,并将所述文件系统映射到内存;当需要对消息进行操作,比如读取或删除文件中的消息内容、或将消息写入文件时,根据消息标识(ID)确定消息在内存中的位置或需要写入内存的地址,即可实现对该消息的快速操作。
[0029] 参照图1,是本发明实施例消息文件管理方法的流程图,包括以下步骤:
[0030] 步骤101,建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件。
[0031] 步骤102,将所述文件系统映射到内存。
[0032] 步骤103,当需要写消息时,选择所述文件系统中的节点目录。
[0033] 在选择节点目录时,可以根据哈希算法来确定,比如,首先根据根目录下的head中的最大子文件系统数(FileSysCount,如有3个),和当前系统的路径比如:c:\\ffs,得到3个子文件系统对象数组列表,比如sub[],它们的目录结构的路径如下:c:\\ffs\0\;c:\\ffs\1\;c:\\ffs\2\。然后每次需要写消息时,通过简单的Hash算法:子文件系统索引=种子数++%最大子文件系统数,再通过sub[子文件系统索引]中取得某个子文件系统,最后通过这个子文件系统创建一个(File)文件对象,并且把消息标识设置到文件对象中。
[0034] 当然,也可以根据其他方法来确定,对此本发明实施例并不做限定。
[0035] 步骤104,将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息。
[0036] 具体地,可以在节点目录下的头文件中设置数据块开关映射表(BitMap)和索引节点列表(InodeList);在数据文件中设置数据块。在写消息时,根据所述数据块开关映射表选择所述数据文件中空闲的数据块;根据内存中的索引节点开关选择所述索引节点列表中空闲的索引节点;然后,将所述消息的内容写入所述空闲的数据块中,并在所述空闲的索引节点中写入所述消息的相关信息。
[0037] 为了快速读取消息,在本发明实施例中,还可以将所述消息写入内存队列中。这样,当需在读取消息时,根据消息标识从所述内存队列中读取消息。
[0038] 在本发明实施例中,在写入消息时,选择所述文件系统中的节点目录,就可以根据选择的节点目录建立消息标识与文件对象的对应关系,并将该对应关系写到一个消息标识与文件对象的映射表中,在将所述消息写入到相应的数据块并将所述消息的相关信息写入相应的索引节点后,可以在所述映射表中所述消息标识对应的文件对象中添加相应的数据块和索引节点的信息,以便于在需要删除消息时快速定位所述消息在文件系统中的位置信息。
[0039] 在需要删除消息时,根据消息标识从所述内存队列中删除该消息,并根据消息标识以及所述消息标识与文件对象的映射表,获取存放该消息的子文件系统以及与该消息相关的数据块和索引节点,更新所述索引节点的状态,即将索引节点开关中对应该索引节点的开关设置为空闲。同时,还要更新内存中数据块开关映射表中对应所述数据块的开关的状态,并删除内存中索引节点列表中的所述索引节点,最后同步Head文件中数据块开关映射表和索引节点列表。
[0040] 需要说明的是,在写消息、删除消息或更新消息时,都需要更新数据开关映射表中数据块对应的开关状态和内存中的索引节点对应的索引开关的状态。
[0041] 可见,利用本发明实施例的方法,综合了缓冲输入流文件和内存映射文件的优点,通过内存映射方式,利用内存缓存部分文件系统的内容,大大提高了文件队列的访问速度。尤其是对于电信的网管应用系统,可以快速定位消息队列中的消息,保证系统运行的实时性、有效性和准确性。
[0042] 下面举例进一步详细说明本发明实施例中文件系统的结构。
[0043] 如图2所示,是本发明实施例中文件系统的存储示意图。其中,FFS为根目录,0、1为节点目录,当然,在一个文件系统中可以有一个或多个节点目录。
[0044] 如图3所示,是本发明实施例中根目录下的Head文件的结构示意图。
[0045] 在该实施例中,根目录下的Head文件包括:文件系统的节点数、最大文件个数、最大文件容量,还可进一步包括校验信息,比如图3中所示的数据检查点1和数据检查点2。其中,所述检验信息用于检查所述文件系统是否被破坏,以保证文件系统的正确性。比如,如果数据检查点2的数值不等于数据检查点1的数值,则表明文件系统已被破坏。
[0046] 节点目录下的Head文件用于保存该节点目录下的存储控制信息,其结构如图4所示,包括:数据块开关映射表和索引节点列表,还可进一步包括超级块。其中:
[0047] 所述超级块用于存储该节点目录下的子文件系统信息,具体信息内容可参照图5中所示,主要有:子文件系统中所有类型的信息块的大小、总数、信息块的偏址以及内存地址等信息。图5中所示的超级块中包含的数据块指向存储的位置字段用于指示文件系统存储的路径,比如是“C:\ffs\”。
[0048] 所述BitMap中包括对应于Data文件中各数据块的开关,用于指示对应的数据块的状态,也就是说,指示所述数据块中是否已有消息写入。每个数据块对应了BitMap中的一个开关,可以用一个比特来表示开关的状态,比如,0表示空闲,1表示非空闲。
[0049] 所述索引节点列表中包括多个索引节点(即图中的I节点),每个索引节点中存储了一个数据块的相关信息,比如数据块中消息的长度、建立时间、消息状态、消息标识以及本身的索引信息(比如索引节点在索引节点列表中的位置)等。每个索引节点状态的变化可以通过索引节点开关来表示,比如索引节点为空时,对应的开关变量为True,否则为False。为了快速定位某个索引节点,可以将索引节点开关以位图的形式保存在内存中。
[0050] 节点目录下的Data文件结构如图6所示,包括多个数据块。为了降低对文件管理的复杂度,可以设定这些数据块的容量大小一致,其中每个数据块用于存储一条消息。
[0051] 需要说明的是,在实际应用中,可以根据各消息的最大长度设定所述数据块的大小,每条消息占用一个数据块,相应地,有一个索引节点存储该消息的相关信息,也就是说,一条消息的存储占用了一个数据块(存储了该消息的内容)和一个索引节点(存储了该消息的相关信息)。当然,如果一条消息所需占用的存储空间大于一个数据块的容量时,也可以占用多个数据块,相应地,有一个索引节点,也就是说,一条消息的存储占用了多个数据块(存储了该消息的内容)和一个索引节点(存储了该消息的相关信息)。
[0052] 可见,为了方便灵活地应用本发明实施例的方法,各子文件系统中的索引节点和数据块的数量可以相同,是一一对应的;索引节点和数据块的数量也可以是不同的,是一对多的关系。具体可以根据应用环境来确定。
[0053] 确定了文件系统的结构,就可以根据该结构建立文件系统。首先,在建立文件之前可以选择文件系统存放的目录路径,根据消息的大小和存放消息的频率计算出文件系统的大小。
[0054] 计算文件系统的大小时,需要先计算以下信息:
[0055] BitMap的块数=块位图数目(有效大小)/(数据块大小*8位);
[0056] 索引节点块数=(最大文件个数*索引节点大小)/消息大小;
[0057] 索引节点起始偏址=BitMap偏址+BitMap的块数;
[0058] 最大Data文件大小=数据块大小*BitMap中的开关数;
[0059] Head文件和Data文件中的块总数=超级块数+BitMap的块数+索引节点块数+数据块数;
[0060] Head文件数=超级块数+BitMap的块数+索引节点块数。
[0061] 比如,可以设定文件系统的默认设置为:位图数目=32K、最大文件数=8K、位图块偏址=1bit、索引节点大小=64bit、索引节点数目=12、数据块数目=32K、超级块数目=1等。
[0062] 例如:文件系统路径=c:\ffs,数据块大小=1024B,2个文件节点时,根据默认配置生成文件系统如图1所示。
[0063] 在建立好文件系统后,需要将所述文件系统映射到内存中,也就是说对文件系统进行初始化的过程。具体地可以按照以下方式进行:
[0064] 首先读取根目录下的Head文件,确定文件系统的节点数、最大文件个数和最大文件容量,然后再初始化子文件系统。
[0065] 初始化子文件系统时,首先根据各节点目录下的Head文件中的超级块的信息,可以确定当前文件系统所需的总空间;其次初始化数据块开关映射表,将文件系统中的数据块开关映射表同步到内存的BitMap中,其中BitMap在内存中的起始位置根据超级块中的BitMap偏址*超级块中定义的数据块大小确定,BitMap的大小根据超级块中的BitMap大小确定,一次Flush的字节数根据超级块中的头文件大小(一般定义Blocksize==headBlockSize)确定;然后初始化索引节点,可以根据索引节点的起始偏址、索引节点块数和最大数据块数(即当前系统中最大索引节点数目(等于最大数据块数、等于最大块位图数),在内存中生成一个索引节点列表,装载索引节点中的信息,同时初始化一个同样长度的文件列表(FileList),以便于在读取或删除消息时使用。最后,初始化Data文件,根据超级块中的数据块起始偏址,得到数据的读写通道。即根据BitMap、数据块的偏址(DataBlockOffset)和数据块数(DataBlockCount),生成一个内存映射列表用来控制数据块;如可以根据超级块中的数据块起始地址(DataPosition即指针)或者索引节点中的消息(消息的开始地址、长度)等相关信息达到快速控制内存和文件系统映射的效果。除此之外,在初始化时,还需要在内存中预生成一个数据块对象池和一个文件对象池,同时初始化一个消息标识与文件对象的映射表,以保存消息标识与文件对象的对应关系,减少消息的频繁生成和删除时的开销。
[0066] 基于上述建立的文件系统,下面分别详细描述消息写入、读取和删除的过程。
[0067] 1.写入消息
[0068] 首先,根据Hash算法选定一个子文件系统,也就是说选择消息写入的节点目录。同时,生成一条消息标识与文件对象的对应关系,将该对应关系保存到所述消息标识与文件对象的映射表中。
[0069] 然后,根据索引节点开关从所述子文件系统的Head文件的索引节点列表中选择一个空闲的索引节点,并从文件对象池中选择一个文件,并且根据索引节点初始化该文件,主要包括设置当前索引节点在文件系统中的位置和确定所述文件的文件名,然后将该文件对象(名称、索引、索引节点、子文件系统、输入流、输出流等信息)放到文件列表中;同时,根据文件对象中的文件输出流和子文件系统新生成一个内存数据块,将所述消息写到该内存数据块中。如果当前输出流的字节数大于等于当前系统写消息到文件的阈值的大小,则还需要将写到所述内存数据块中的消息同步到所述文件系统映射到的内存和文件系统中。所述阈值可以是自定义但是必须小于等于数据块的大小。具体过程如下:
[0070] 写数据块:根据BitMap选择一个空闲数据块,得到其起始地址,将所述消息写到该空闲数据块中,然后将该数据块写到Data文件中;
[0071] 写索引节点:在空闲数据块中写入消息后,设置所述空闲的索引节点的状态为非空闲状态,也就是说,将索引节点开关中对应该索引节点的开关设置为非空闲状态,并更新索引节点中的信息,主要是将当前消息的长度、状态、创建时间和校验信息等保存到该索引节点中,并将该索引节点和BitMap中的数据开关状态写到Head文件中。
[0072] 需要说明的是,为了便于快速读取消息,还可以将所述消息写入到内存队列中。
[0073] 2.读取消息
[0074] 在读取消息时,可以根据消息标识直接从内存队列中读出消息,而无需读取文件系统,从而可以提高读取速度。
[0075] 3.删除消息
[0076] 在需要删除消息时,可以根据消息标识直接从所述内存队列中删除消息,并且根据消息标识以及所述消息标识与文件对象的映射表,获取存放该消息的子文件系统以及与该消息相关的数据块和索引节点,更新所述索引节点的状态,即将索引节点开关中对应该索引节点的开关设置为空闲。同时,还要更新内存中数据块开关映射表中对应所述数据块的开关的状态,并删除内存中索引节点列表中的所述索引节点,最后同步Head文件中数据块开关映射表和索引节点列表,即更新数据开关映射表中数据块对应的开关状态和内存中的索引节点对应的索引开关的状态。
[0077] 可见,本发明实施例的方法利用内存映射和索引算法可以快速写入、读取、删除文件系统中的消息。该文件系统存储的是二进制形式的字节流,可以适用各种协议,比如http、https、rmi、webservice等协议消息队列的管理。
[0078] 本发明实施例的方法可以应用于多种消息处理环境,比如应用于同步消息的处理中,由系统A产生和发送消息给系统B。系统A在发送消息(内存中的消息)给系统B之前,将消息写入队列,然后有两种情况:(1)可以根据系统B返回的消息状态,系统A负责清除队列中的消息;(2)系统B可以直接回调系统A来负责清除队列消息。最后系统A可以定期轮询队列,看看是否有消息没有被置状态,重新发送消息给系统B。还可以应用于异步消息的处理中,比如将消息队列单独部署成一个应用系统,系统A负责写消息,而系统B负责读消息,而消息的状态仅仅由系统B和队列系统控制。
[0079] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质,如:ROM/RAM、磁碟、光盘等。
[0080] 本发明实施例还提供了一种消息文件管理装置,如图7所示,是该装置的一种结构示意图。
[0081] 在该实施例中,所述装置包括:文件建立单元701、映射单元702和消息写入单元703。其中,文件建立单元701,用于建立文件系统,所述文件系统包括根目录和节点目录,所述根目录下包括头文件,节点目录下包括头文件和对应的数据文件;映射单元702,用于将所述文件系统映射到内存;消息写入单元703,用于当需要写消息时,选择所述文件系统中的节点目录,并将所述消息的内容写入所述节点目录下的数据文件中,并在所述节点目录的头文件中写入所述消息的相关信息。
[0082] 为了方便对文件中消息的管理,可以在节点目录下的头文件中设置数据块开关映射表和索引节点列表;在节点目录下的数据文件中设置数据块。所述消息写入单元703包括:节点目录选择子单元731,用于利用哈希算法确定所述节点目录;数据块选择子单元732,用于根据所述数据块开关映射表选择所述数据文件中空闲的数据块;索引节点选择子单元733,用于根据内存中的索引开关选择所述索引节点列表中空闲的索引节点;写入子单元734,用于将所述消息的内容写入所述空闲的数据块中,并在所述空闲的索引节点中写入所述消息的相关信息。
[0083] 利用本发明实施例的装置,可以快速将消息写入文件系统中。具体过程可参照前面本发明实施例的方法中的描述。
[0084] 当然,在本发明实施例的装置中还可以设置有队列写入单元704和消息读取单元705。其中,用于将所述消息写入内存队列,以方便消息的读取。这样,在读取消息时,消息读取单元705可以根据所述消息标识直接从所述内存队列中读取消息,而无需读取文件系统,从而提高了消息的读取速度。
[0085] 为了进一步提高对文件系统中消息的定位速度,在本发明实施例的装置中,还可以设置有映射表建立单元706和消息删除子单元707。其中,映射表建立单元706,用于建立所述消息标识与文件对象的对应关系,所述文件对象包括以下信息:选择的节点目录、所述消息内容写入的数据块、所述消息的相关信息写入的索引节点;消息删除子单元707,用于当需要删除消息时,根据所述消息标识与文件对象的对应关系,确定与所述消息相关的数据块和索引节点;更新所述数据块对应的数据块开关映射表中的开关状态及所述索引节点对应的内存中的索引开关状态。对文件系统中保存的消息的删除过程可参照前面本发明实施例的方法中的描述。
[0086] 本发明实施例的装置利用内存映射和索引算法可以快速写入、读取、删除文件系统中的消息。该文件系统存储的是二进制形式的字节流,可以适用各种协议,比如http、https、rmi、webservice等协议消息队列的管理。
[0087] 以上对本发明实施例进行了详细介绍,本文中应用了具体实施方式对本发明进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及设备;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。