【发布时间】:2014-04-28 23:08:16
【问题描述】:
从文件中读取行并处理它们时,我在某些代码中使用了文件系统锁。这是因为我的架构有不止一个应用服务器;我只希望单个服务器处理每一行以避免数据重复。
我在辅助方法中创建了一个 DTO。该对象填充了锁定详细信息,该详细信息可以由辅助方法返回,并且可以随后查询以查看锁定是否成功。如果是这样,就可以处理文件中的行。
通常,如果两台服务器同时尝试处理文件中的行,则其中一台服务器会抛出异常,因为该文件已被另一台服务器锁定。如果发生这种情况,我的代码会捕获异常并移至文件的下一行。
锁实现如下:
String filename = <Unique identifier of record being processed>;
File lockfile = new File(System.getProperty("java.io.tmpdir"), filename);
RandomAccessFile randomAccessfile = new RandomAccessFile(lockfile, "rw");
FileChannel fileChannel = randomAccessfile.getChannel();
FileLockDTO fileLockDTO = new FileLockDTO();
fileLockDTO.setLockedfile(lockfile);
fileLockDTO.setRandomAccessfile(randomAccessfile);
fileLockDTO.setFileLock(fileChannel.tryLock());
在绝大多数情况下,代码运行良好。然而,在极少数情况下,会出现重复记录,这表明存在多个应用程序服务器似乎可以在完全相同的时刻创建锁的边缘情况。
我仔细查看了代码并尝试了许多测试,但无法确定这是如何发生的。只是想知道是否有人有任何想法?
提前感谢您的帮助。
【问题讨论】:
-
我使用的是 Java 1.7 版。
-
那你想试试
Files.createFile(pathHere). -
让应用服务器从文件中读取行似乎不太可能成功。你需要一个真正的排队系统;您可以使用 AMQ、ZMQ、MongoDB 或 ...
-
您的锁定文件是纯粹用于锁定的辅助文件吗?另外,您是否在任何其他代码中打开锁定文件?
-
@jtahlborn 这些文件纯粹用于在这种情况下锁定,不用于其他任何地方。