从文件读取行并处理它们时,我在某些代码中使用文件系统锁。这是因为我的架构有多个应用程序服务器;我只想要一台服务器来处理每一行以避免数据重复。Java中的文件系统锁
我在辅助方法中创建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。 – GarlicBread
然后你想尝试'Files.createFile(pathHere)'。 – fge
决斗应用程序服务器从文件读取行似乎不可能成功。你需要一个真正的排队系统;你可以使用AMQ,ZMQ或MongoDB,或者... – bmargulies