上交所市场行情mktdt00.txt数据文件监听问题及解决方案
前言
本篇博文记录了博主在工作中,解析上交所行情数据文件时遇到的问题,以及解决方法。希望通过本篇博文,可以帮到遇到相同问题的博友。
概述
上交所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资源的占用会比较高。
如果看到这里的各位能想到更好的解决方法,欢迎在评论区交流~