气象水文到报监测的实时性设计

时间:2022-09-04 11:33:19

气象水文到报监测的实时性设计

作者简介:张志杰(1973—),男,山东成武人,高级工程师,研究方向:软件工程(E-mail:);刘金胜(1980—),男,山东高密人,工程师,硕士,研究方向:计算机软件技术。

摘要:到报监测是气象水文数据传输、处理等的重要环节,其实时性是关键设计目标。通过分析文件目录扫描方法和消息通知机制的应用特点,结合气象水文资料传输、处理规程及应用模式,重点阐述了结合实时性和可靠性要求的到报监测方法,并给出一种重构性强、应用灵活的到报监测模块的设计方案。

关键词:气象水文资料到报监测;实时性;FileSystemWatcher;目录扫描;软件设计

中图分类号:P4文献标识码:A

1引言

到报监测旨在获取最新到达的资料信息,既是资料传输业务监控管理的主要内容,也是资料处理应用系统的重要组成部分。气象水文资料应用实时性要求高,及时响应资料到达状态,提高到报监测的实时性,是资料实时处理的前提。

有别于计算机数据库系统,气象水文资料在生成、处理和转储等应用过程中,多以磁盘文件的形式存储,效存储在计算机系统中的一般文件,其特点主要表现为种类多,到报量、到报时间粒度、数据大小差异性大,数据文件按照类别存储在不同的目录,文件名称中多含有与时间或者类别相关的信息;其信息服务应用特点是时效性强、更新快,操作系统多样,数据访问复杂等。因此气象水文资料到报监测的实时性设计难度大。

常规获取资料到报的方法是进行两次目录扫描,对比前后扫描结果,提取资料更新信息。该方法对于目录内文件较多时,获取的周期就会过长,且频繁的扫描影响系统效率。另一种方法是基于Windows消息机制的文件系统监视,实时响应资料更新,但是该机制由于缓存溢出等多种原因而时常失效。

本文结合目录扫描方法和消息通知机制,利用气象水文资料及其使用要求的特点,通过优化变更信息获取方法,设计了基于队列管理的多任务到报监测方法,能够有效提高相关应用的实时性和可靠性,并采用面向接口的软件设计思想,给出了易于维护的软件设计[2]。

2监测方法

2.1定时轮询

定时轮询方法是按照一定时间间隔扫描整个被监视目录及其子目录中的文件,记录每个文件的属性(例如:文件最后修改时间、HASH值、CRC校验码等),比较前后两次扫描获得的信息,筛选出变化的资料,是一种可靠的方法。

但是,这种方法的缺点也很明显:首先,扫描一遍目录需要花费一段时间,如果目录中文件或子目录数量过多、目录层次过深,扫描花费的时间可能会更长,对于实时性要求高的应用来说,是不允许的;其次,频繁的文件扫描需要对文件进行操作,如果这时恰好也有其它程序对该文件进行操作,就会产生资源占用冲突;第三,由于文件越大,计算其HASH或者CRC值的时间就越长,也会影响信息获取的实时性。

2.2实时通知

Windows系统是一个消息(message)驱动的操作系统,即系统维护一个或多个消息队列,所有产生的消息都会被放入到消息队列中。系统根据消息的接收句柄而将该消息发送给拥有该句柄程序的消息循环。

实时通知是利用Windows操作系统内核提供的文件系统监视(File System Watcher)消息机制。应用程序通过建立一个被监视文件或者目录的句柄,将其注册到操作系统文监视消息通知中,就可以收到来自操作系统的文件或者目录的变更通知。由于消息是由Windows操作系统内核发出的,可以近似认为是与文件系统的更新是同步的,也就可以说,采用这种模式获得的文件更新事件,是在文件或目录发生改变的瞬间获得的,可以认为是实时的。

在具体实现方面,Windows操作系统对目录和文件的监控提供了两个消息驱动的API函数[5]:FindFirstChangeNotification和ReadDirectoryChangesW。调用它们就可以获取Windows为文件系统记录的消息队列。在.NET Framework 2.0以上的版本中,提供了FileSystemWatcher类侦听文件系统更改通知,在目录或文件发生更改时引发事件,是对上述API进行的封装,简化了文件监控方法的实现。

尽管实时通知已经很好地保证了Windows操作系统中文件监测的实时性,利用FileSystemWatcher类实现也较为简单,但是,实际应用中却有如下问题:

1)一次文件变化,可能引发多个消息,从而造成多次重复操作。例如:在一次资料内容变化时,除了内容变化之外,还有文件其他属性(例如:文件最后修改日期、文件大小)也变化了;

2)文件系统监视通过向Windows系统注册来接收来自系统的文件或者目录的变更消息,一旦发生操作失误,注册就会断开,造成文件系统监视永久失效。这种情况主要发生在:一次变化的文件数量过多,或者文件的名字过长、目录层次过深,而造成缓冲溢出;对于存储在远程共享目录、网络驱动器目录的资料进行访问时,由于网络链路连通性故障,而造成监视目标访问失败;

3)文件系统监视无法获取应用系统运行之前的信息,即已经发生过的资料变更。

3方案设计

实时通知方法虽然实时性好,却不是一个可靠的到报监测方法。相反,定时轮询每次都需要进行一次完整的文件扫描和对比,效率低、实时性差,但是却不会产生上述实时通知失效的问题,是一种可靠的文件监测方式。

综上所述,将两种文件监测方法结合起来使用,扬长避短,不失一个较为完美的解决方案。

3.1总体设计

图1描述了到报监测模块主要类设计,也说明了到报监测在整个应用系统中的位置及其关系。到报监测属于应用系统的一部分,向其客户类(Client)提供资料更新信息以及操作接口(IDo)。

FileTimer类和FileWatcher类分别实现了定时轮询、实时通知功能;FileObject类是资料到报信息的容器,是队列类(Queue)管理的对象;Task类提供了包括定时轮询和实时通知两种方法的指定资料监测任务,并向客户系统提供相应的操作接口(IDo);TaskMgr类负责任务(Task)创建及其管理;客户(Client)只要实例化TaskMgr类,创建资料到报监测任务(Task)实例,就可以实现资料到报实时信息获取。这种设计上的优势表现为:

1)操作(FileTimer、FileWatcher)和数据(FileObject)分离,实现了数据独立管理和资源共享;

2)一个目录的到报监测抽象为任务(Task),实例化Task对象即建立了一个目录监测;

3)操作接口(IDo)设计,使得到报监测和具体资料操作相分离,从而实现不同资料的多种操作,符合“针对接口编程,而不是针对实现编程”[1]的思想;

如图2,以定时轮询为例,fileTimer对象监测到资料到报时,通知task创建(New)新fileObject对象,进行入队(Push),queue将fileObject对象通知给task,执行资料操作(Do)。

设计中大量采用对象组合,通过获得其它对象的引用而在运行时刻动态定义,充分封装而使单个任务集中在一个类中。这种设计在实现上存在较少的依赖关系,使得系统易于扩展和维护[6]。

3.2定时轮询

定时轮询按照一定时间间隔进行全目录扫描,其扫描效率和时间间隔有密切的关系。当时间间隔过大时,实时性差;时间间隔过小时,由于频繁的扫描,势必影响整个应用系统的运行效率。设定合理的扫描间隔是优化扫描效率的主要手段。此外,也可以利用特定通配符和限定文件时间,从而缩小扫描范围。

如图3,FileTimer类设计体现了扫描优化:

1)资料到报时次是有一定规律的,通过分析和归纳,可以总结出到报时间间隔。扫描间隔(interval)控制定时器(timer)扫描频率,可以参考资料到报频次设置其值;

2)文件年龄(age)是指文件最后修改时间与当前时间差,仅对符合文件年龄的资料进行对比,可以加速扫描速度;

3)气象水文资料文件通常按照某种规范命名[3]。以地面天气观测报为例,每小时6次报文,命名规则为“TTDDHHmm.abj”,其中:

TT代表资料类型,例如:SN地面报、UN探空报、GX格点报等;

DD代表编报日期,01-31编码;

HH代表编报时间(UTC),按小时计,00-23编码;

mm代表编报时间(UTC),按分钟计,编码值为00、10、20、30、40、50;

abj代表国家气象中心代号后三位。

类成员wildcard表示需要扫描的资料文件通配符,可以归纳出地面天气观测报文件wildcard值为“??DDHHmm.abj”。扫描时,只需要将其中时间符号替换为实际值。

将上述到报时次和文件命名规则结合起来,可以进一步优化,例如:如果每小时进行地面天气观测报扫描,则wildcard值为“??DDHH??.abj”;每分钟进行扫描,则为“??DDHHmm.abj”。如图4,task对象创建FileTimer类对象,调用Start方法启动任务,并调用Update执行一次目标全扫描,这样就可以收集到应用系统运行之前的资料信息;当定时器执行(OnTimer)时,开始进行扫描(Update),查找到资料时,通知(Notify)task进行资料条件符合性检查(age、wildcard),对符合条件的变更信息入队(Push)。图5实时通知类3.3实时通知

如图5所示,成员fileSystemWatcher(以下称监视器)是FileSystemWatcher类对象。正如前面所述,监视器本身是很脆弱的,其自身的有效性需要建立定时器(timer)对其进行定期检查(Check),也可以响应缓冲溢出的错误消息(OnError),并在失效时自动恢复(Reset)。监视器也支持文件过滤,wildcard值也可以参考定时轮询设置。

如图6,任务实例(task)创建实时通知(FileWatcher)对象,启动(Start)实时通知实例后,由定时器定期检查监视器有效性;当收到来自监视器的资料变更消息(OnChanged)时,通知task进行资料条件符合性检查,对符合条件的变更信息入队(Push)。

3.4队列管理

当应用系统收到资料变更消息时,还不能立刻执行操作,这是因为监视器在发现被监视目录变化时,即向注册应用发出消息,而此时有可能数据还未准备完毕,特别是大文件复制时,立即进行资料操作,势必造成资源占用冲突;此外,考虑到资料文件操作失败的可能,也需要再次执行。因此,采用了缓冲队列存储资料变更和操作失败的资料信息。

由于到报监测只是为了获取资料信息,而不是为了获取其内容,因此,采用文件最后修改时间(Last Written Time)作为区别文件版本的标识,而非进行复杂的HASH、CRC值计算。

如图7,FileObject类抽象了资料变更信息,以资料全路径名称(fullpathname)和最后修改时间(time)为标识,通过Contain判断唯一性;时间跨度(span)记录下次可用性测试时间;生命周期(lifes)记录变更文件入队次数,超过最高次数(MaxLife),文件将被丢弃,不再检查。

如图8,task收到监视器资料变更通知(OnNotify),首先构造(New)一个FileObject对象,检查是否队列中已经存在(Contain),若不存在则进行入队(Push)。

如图9,队列管理快速查找每个fileObject对象的span值小于当前时间值,并测试可访问性,将符合条件的对象通知(Notify)给task,进行具体资料操作(Do)。

该操作也存在一个问题,如果队列过长,会延误操作的时间,造成实时性的降低,因此,方案设计的队列并非严格意义上的先入后出队列。入队时span值累加一个很小的时间差,出队条件是span值小于当前时间。

如图10,出队的fileObject由于不可访问或者执行错误时,可以重新入队。通过复制创建新FileObject类对象,其span值在被复制对象span值的基础上累加了一个时长,并将递增被复制对象的lifes值赋给新对象的lifes值。如果新对象的lifes值大于最大生命周期值(MaxLife),则不会建立新对象,并释放被复制对象,返回空值(null)。

缓冲队列设计的优势在于:当资料不可访问,或者资料处理操作失败时,可以重新入队等待操作;其次,通过Contain方法检查队列中是否已经存在FileObject类对象,可以防止因同一资料到报信息多次触发。3.5任务管理

应用系统通常同时处理多种气象水文资料,由于资料按类别分别存储在各自的目录中,因此,需要独立进行各自的到报监测,即采用多线程的多任务处理。

如图11,任务管理类(TaskMgr)包含了一个任务类(Task)的集合:一种资料的到报监测对应一个task,TaskMgr是Task的容器。Task类中聚合了FileTimer类、FileWatcher类和Queue类,提供了启动任务(Start)、停止任务(Stop)等基本的任务操作,也可以立即启动扫描(Update)。当队列中有符合条件的FileObject类对象时,执行资料文件的相应操作(Do);同时,操作中的错误可以通知(Notify)给任务。

4总结

综合上述可知,从资料到报开始到资料应用的时间值大小与队列长度和span值有关:当队列越长时,遍历花费的时间越长。通常情况下,气象水文资料按时次定量到报,设计上完全符合实时性要求;极端情况时,资料一次到达过多、资料处理错误过多而造成的重新入队,以及用户启动一次全目录扫描时,通过使用资料通配符(wildcard),控制采集资料年龄(age)可以降低入队资料信息的数量。

本文所述的到报监测方法在气象水文资料传输、资料实时解报和资料传输状态监控等多个系统中得到了应用,发挥了巨大作用。实践证明,资料到报监测及时、可靠性高,特别是易于维护的体系结构设计,便于理解和扩展,更是系统快速重构和应用的基础。

参考文献

[1]Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides[美],设计模式:可复用面向对象软件的基础. 李英军等(译)[M].北京:机械工业出版社,2000年9月

[2]Joshua Kerievsky[美]. 重构与模式,杨光 刘基诚(译)[M].北京:人民邮电出版社,2006年12月

[3]总参气象水文空间天气总站信息中心[S].常用气象水文资料手册,2012年12月

[4]王世忠 译.C语言与Unix系统编程,(美)胡佛 著[M].北京:清华大学出版社,2011年7月

[5]宋晓宇.windows操作系统核心编程实验教程[M].北京:中国铁道出版社,2010年4月

[6],(美) 布奇(Booch,G.) 著,王海鹏,潘加宇 译.面向对象分析与设计(第3版)[M].北京:电子工业出版社,2012年7月

上一篇:基于无线图像传输的智能侦察系统研究 下一篇:信息化条件下医院财务管理功能拓展探讨