999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

氣象水文到報監測的實時性設計

2013-01-01 00:00:00張志杰劉金勝謝曉峰
計算技術與自動化 2013年3期

作者簡介:張志杰(1973—),男,山東成武人,高級工程師,研究方向:軟件工程(E-mail:codedajie@126.com);劉金勝(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),則不會建立新對象,并釋放被復制對象,返回空值(1)。

緩沖隊列設計的優勢在于:當資料不可訪問,或者資料處理操作失敗時,可以重新入隊等待操作;其次,通過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月

主站蜘蛛池模板: 国产成人一级| 激情乱人伦| 日韩毛片在线播放| 欧美日韩一区二区三| 一区二区三区精品视频在线观看| 91视频精品| 亚洲欧美极品| 国产乱子伦一区二区=| 午夜一级做a爰片久久毛片| 亚洲天堂.com| 国产大全韩国亚洲一区二区三区| 国产成人久久综合一区| 国产精品亚洲一区二区三区z| 久久精品一卡日本电影| 99久久成人国产精品免费| 国产va在线| 97久久人人超碰国产精品| 天堂亚洲网| 国产免费久久精品99re不卡| 成人免费视频一区| 国产精品视频观看裸模| 午夜欧美理论2019理论| 青青久久91| 小说区 亚洲 自拍 另类| 国产精品污污在线观看网站| 亚洲成人播放| 九九香蕉视频| 欧美国产日韩一区二区三区精品影视| 秘书高跟黑色丝袜国产91在线| 97国产一区二区精品久久呦| 欧美日韩午夜| 亚洲首页在线观看| 亚洲最新地址| 最新日本中文字幕| 少妇高潮惨叫久久久久久| 特级aaaaaaaaa毛片免费视频| 成人毛片在线播放| 亚洲手机在线| 伦精品一区二区三区视频| 青青操国产视频| 国产一级精品毛片基地| 国产精品九九视频| 成人第一页| 无码精品国产dvd在线观看9久| 青青青国产在线播放| 国产成人精品午夜视频'| 亚洲aaa视频| 91久久偷偷做嫩草影院| 在线视频亚洲色图| 成年A级毛片| 国产在线97| 国产一区二区人大臿蕉香蕉| 九九久久99精品| 日本日韩欧美| 丁香婷婷综合激情| 波多野结衣一二三| 国产在线视频自拍| 国产欧美视频在线| 午夜激情福利视频| 久久精品日日躁夜夜躁欧美| a级毛片免费播放| 亚洲精品亚洲人成在线| 久久这里只精品国产99热8| 成年免费在线观看| 欧美日韩国产在线播放| 国产91线观看| 欧美笫一页| 亚洲无限乱码| 亚洲国产精品日韩欧美一区| 国产在线视频福利资源站| 91精品人妻互换| 成人亚洲国产| 国产人人干| 国产精品天干天干在线观看| 九九热视频在线免费观看| 2024av在线无码中文最新| 国内精自线i品一区202| 日韩二区三区无| 漂亮人妻被中出中文字幕久久| 中国黄色一级视频| 久久免费看片| 欧美成人怡春院在线激情|