上交所市場行情mktdt00.txt資料檔案監聽問題及解決方案

码奇码發表於2024-08-18

前言

本篇博文記錄了博主在工作中,解析上交所行情資料檔案時遇到的問題,以及解決方法。希望透過本篇博文,可以幫到遇到相同問題的博友。

概述

上交所level1行情接收方式

上交所level1行情,是透過檔案檔案形式進行釋出。
具體接收方式,可以參考官方文件:https://www.sse.com.cn/services/tradingtech/data/c/10760189/files/f58f3c9534894294bfc5627659c143da.pdf
檔案協議參考:https://www.sse.com.cn/services/tradingtech/data/c/10758898/files/ba46bc662ded4072828f7f927235ddd2.pdf
若機構想接收上交所行情資料,需在本方伺服器安裝上交所提供的接收程式,接收程式會不斷獲取最新行情資料檔案(一般是txt檔案),檔案中記錄的是所有證券最新的快照行情資料,每次更新都會全量覆寫。

行情檔案解析

正常來說,行情檔案解析程式不會和行情接收程式部署在同一臺機器上,因為一般一家公司只能部署一個接收程式,但使用行情檔案的系統可能不止一個。
所以我們通常是透過檔案同步工具,將接收到的行情檔案實時同步到nas盤,或者直接同步到解析程式所在機器的檔案目錄。解析程式會不斷監聽檔案是否更新,一旦檔案更新,程式會將檔案內容全量解析出來,並推送給下游服務進一步處理。

遇到的問題

使用Java實現檔案更新監聽的方式大致有以下三種:

  • 方法一:定時任務 + 判斷File#lastModified變動
  • 方法二:使用Apache Commons-IO監聽檔案修改事件
  • 方法三:使用Jnotify監聽系統修改檔案事件

對於上交所的大多數行情檔案,這三種方法都是可行的。
但在處理mktdt00.txt檔案時遇到了問題,與其他檔案不同的是,此檔案在內容更新時,檔案的修改時間和檔案大小都不會發生變動!!
這時,用前兩種方法就GG了,因為根本無法透過檔案資訊來判斷檔案是否更新!!

那麼此時讓我們看一下第三種方法的表現如何:

  • 情況一:
    檔案同步工具直接將檔案同步到檔案解析程式所在機器的目錄。此時程式監聽是能生效的。
    因為JNotify監聽檔案變更的原理主要基於作業系統的檔案系統通知機制,它透過Java提供的本地介面(JNI)或直接呼叫系統API來實時監控檔案或目錄的變化。
    因此,即使檔案屬性並沒有發生變更,但觸發了系統的檔案變更事件,那麼變更就會被JNotify捕捉到!
  • 情況二:
    檔案同步工具將行情檔案同步到共享nas盤,再將nas盤網路路徑掛載到解析程式所在機器,程式遠端監聽檔案變更。此時檔案監聽是不生效的!
    因為JNotify無法透過網路對其他系統進行系統事件監聽,這種方案便是行不通的。

解決方案

由於我們希望透過“情況二”進行服務部署,那麼我們就必須解決這個問題。
透過上面的描述,我們可以知道,程式是無法透過檔案屬性和系統事件來判斷檔案是否變更。
目前想到的解決方案是,透過檔案內容判斷,當然並不是對全文解析,而是直接解析檔案頭中的時間戳!

透過判斷時間戳是否變更,來判斷檔案內容是否更新,當然這需要我們設定一個定時任務來執行。
不過此方法的缺點顯而易見,即使檔案內容沒有更新,定時任務也會不斷地讀取檔案內容,對IO資源的佔用會比較高。

如果看到這裡的各位能想到更好的解決方法,歡迎在評論區交流~

相關文章