1

我有两个独立的 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,但我担心它不会消除对哈希检查的需要,因为如果生产者崩溃,即使文件可能仍然不完整,操作系统也会释放其所有锁。这实际上很可能会产生不完整的文件。也许一个锁加上一个消费者仍在运行的检查?

4

1 回答 1

0

生产者可以在开始新文件之前关闭文件。

消费者可以在开始前一个文件之前等待下一个文件。

于 2012-07-06T13:00:12.780 回答