获取文件/目录的一致视图以进行读取

时间:2019-04-05 15:33:22

标签: java linux concurrency symlink consistency

假设我有两个过程。其中之一是不断地将数据写入目录中的文件(为了便于讨论,我们将它们称为日志文件),在该目录中,新文件经常会启动。其中一个文件是当前的“活动”文件,该文件每秒钟左右被自动写入新数据。 “活动”文件将始终处于干净状态。

第二个过程从目录中的文件(包括“活动”文件)读取数据。假设它需要多次读取文件,但是又需要“冻结”的文件一致视图,包括实时文件。即使在读取器进程运行时正在更新“活动”文件,读取器一旦开始从文件中读取文件,它仍需要查看其启动时的状态(就像未发生新写入一样)。 / p>

不幸的是,读取器和写入器过程都来自我无法更改的第三方库。我需要找到一种方法来协调我的应用程序中的两个过程,并使它们协同工作。

我的应用程序(启动第3方库的读取器和写入器进程)是用Java编写的,并在Ubuntu Linux上运行。

我的想法:我正在寻找与数据库事务类似的东西,并且具有一致的读取能力,但需要文件系统。

问题:

  1. 在Linux中,是否可以通过某种特殊的“一致读取”符号链接来实现此目的,该符号链接指向包含文件的目录?然后我可以“刷新”特殊符号链接以使其自上次刷新以来“查看”更新,或者删除它并创建一个新的符号链接?
  2. 有没有办法在Java / Scala中做类似的事情?

我想做类似的事情:

public String launchReaderWithConsistenData(String folderPath) {
  ConsistentFolder consistentDataFolder = OS.getConsistentReferenceTo(folderPath);
  String readData = ThirdPartyLibrary.readSomeData(consistentDataFolder.getPath());
  consistentDataFolder.release();
  return readData;
}

当然,“ ConsistentFolder”和“ getConsistentReferenceTo()”是我组成的,但是希望它们类似,如果ThirdPartyLibrary.readSomeData()从文件中多次读取,它将始终获得相同的数据,即使原始folderPath中的数据在两次更新之间也是如此。

除上述内容外,我唯一的其他想法是为读取器的每个调用创建目录的新物理副本,但是我担心这样做会效率低下,因为文件会很大。

0 个答案:

没有答案