我有两个独立的 Java 进程,一个生产者和一个消费者,它们的行为如下:
制片人:
write data file
close data file
write hash file
close hash file
消费者:
wait until hash file exists
read data file
act on data file
close data file
delete data file
delete hash file
此代码仅使用哈希文件来表示数据文件已完成。此处未验证哈希值。在正常负载下,应该每 3 秒切换一次。在非常重的负载下,速率可能会增加到每 100 ms 一次切换。文件系统是 ext3,data=ordered。
如何确保消费者永远不会看到不完整的文件?
一种选择是根据散列验证数据文件的内容,但这似乎不必要地昂贵。我考虑过使用java.nio.channels.FileLock
,但我担心它不会消除对哈希检查的需要,因为如果生产者崩溃,即使文件可能仍然不完整,操作系统也会释放其所有锁。这实际上很可能会产生不完整的文件。也许一个锁加上一个消费者仍在运行的检查?