加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何最好地在Java集群中锁定文件

发布时间:2020-12-15 02:15:48 所属栏目:Java 来源:网络整理
导读:我有一个在JBoss上运行的服务器集群.我需要以安全的方式更新文件.具体来说,我需要 锁定文件A – 如果它已经被锁定,则以安全的方式阻塞,这样如果JVM突然死亡,就不会有悬空锁定. 30秒的超时时间没问题. 读取文件A. 改变内容 将文件写入临时名称A.tmp 删除原始
我有一个在JBoss上运行的服务器集群.我需要以安全的方式更新文件.具体来说,我需要

>锁定文件A – 如果它已经被锁定,则以安全的方式阻塞,这样如果JVM突然死亡,就不会有悬空锁定. 30秒的超时时间没问题.
>读取文件A.
>改变内容
>将文件写入临时名称A.tmp
>删除原始文件A.
>将A.tmp重命名为正确的名称A.
>解锁文件A.

当我查看java.nio.FileLock时,它似乎与一个InputStream相关联.我真的只需要锁定一个抽象名称.我不需要锁定文件的一部分.如果这是最佳选择,我可以为此创建一个锁定文件(与数据文件分开).然而,我的问题的主要问题是我需要在读取之前获取锁定,然后在更新文件后释放锁定.请注意,我更新文件的方式是为了确保文件系统上没有部分写入的文件.我需要编写整个文件,然后在编写后重命名它,以确保任何文件保存该名称都有一整套内容,如果进程在写入过程中死亡,则会留下一个可以轻松清理的临时文件以后.

java.nio.FileLock真的是用于这种用途吗?或者我应该看别的东西?

解决方法

这就是我最终做的事情.对于名为“XXX”的每个文件,我使用名为“XXX#LOCK”的零长度锁定文件

>我使用RandomAccessFile将其锁定以进行更新.
>当此锁定文件被锁定时,我操纵有问题的实际文件:读取原始文件,流式传输到临时文件,删除原始文件,以及重命名临时文件等.
>我解锁了锁文件

锁定代码:

File lockFile = new File(target.getParent(),target.getName() + "#LOCK");
    lockAccessFile = new RandomAccessFile(lockFile,"rw");
    FileChannel lockChannel = lockAccessFile.getChannel();
    lock = lockChannel.lock();

解锁代码:

if (lock != null) {
        lock.release();
        lock = null;
    }
    if (lockAccessFile != null) {
        lockAccessFile.close();
        lockAccessFile = null;
    }

我将它包装在一个类中,该类使得锁定和解锁与原始文件的读取或写入一起.如您所见,lock和lockAccessFile是成员变量.

我从来没有在锁文件中写任何东西,但它们存在于文件夹中.由于我有少量文件要以这种方式管理(其中6个),我只是将LOCK文件留在那里,因为它是丑陋但无害的开销.

这在我的代码中跨多宿主集群工作,因为我的代码是唯一操纵这些文件的东西.最大的问题是,如果其他一些代码在不知道此约定的情况下开始操作文件,则会导致问题.我没有找到任何证据表明有一种标准的方法来处理这个问题,这个问题将由操作系统强制执行,同时由Java支持.如果您知道,请告诉我.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读