项目背景,是使用管道做一个推送式的数据中转。c将数据块吐入管道,另一端java接受解析并上传服务器。
数据块是以报文+不定长数据的形式传递的,所以使用
fp = new RandomAccessFile(fifo, “r”); 方式打开来实现指定偏移位的读取
这当中存在一些问题
1.读端必须以"r"方式打开,"rw"方式会造成无法感知写端的close()操作
2.当写端异常并退出后,读端fp.read(buf)会阻塞,想要退出必须由监控现场再以rw方式打开此管道文件并主动close,读段才能接收到关闭信息并退出阻塞
3.最难搞的一种场景。当写端在读端new RandomAccessFile之前就已经崩溃或者在open管道文件前就已经奔溃,读端会永久阻塞在new RandomAccessFile这一步。这时监控线程异步打开此管道也没用。但是rw方式打开管道文件并不会阻塞。因为是jni接口,中断读段线程的方式也是无法退出的。当前发现的有效退出方式只有由管理进程kill -9 pid一种。