将文件/“文件夹”锁定到特定的 JVM 并在锁定时进行迭代

Posted

技术标签:

【中文标题】将文件/“文件夹”锁定到特定的 JVM 并在锁定时进行迭代【英文标题】:Lock file/"folder" to a specific JVM and iterate if locked 【发布时间】:2019-02-22 07:23:06 【问题描述】:

我正在使用多个 JVM,但我需要每个 JVM 使用一个特定的文件夹。我要做的是遍历文件夹,直到找到未锁定的文件,然后将其锁定以使用该特定文件夹。

我在这里过滤我想使用的文件夹:

  // Filter 'fran' folders
  String dir = System.getProperty("user.dir");
  FilenameFilter filter = new FilenameFilter() 
     public boolean accept(File dir, String name) 
        String lowercaseName = name.toLowerCase();
        if (lowercaseName.startsWith("fran")) 
           return true;
         else 
           return false;
        
     
  ;
  File[] dirs = new File(dir).listFiles(filter);

然后我尝试浏览这些文件夹并检查它是否被f.canWrite() 锁定。但是,它似乎总是只使用一个文件夹而忽略其他文件夹。

  // Find available folder
  boolean lock = true;
  String lock_folder = "";
  FileChannel fileChannel = null;
  FileLock lockfile = null;
  File f = null;

  while (lock) 
     for (File folder : dirs) 
        f = new File(folder + "\\lock.txt");
        Boolean isnotlocked = f.canWrite();
        if (isnotlocked) 
           fileChannel = new RandomAccessFile(f, "rw").getChannel();
           lockfile = fileChannel.lock();
           lock = false;
           lock_folder = folder.getAbsolutePath();
           break;
        
     
  

我之前尝试过在没有 FileLock 的情况下完成我需要的工作,在特定文件夹中创建一个文件,然后在完成后删除。如果文件夹没有该文件,它将创建并锁定该 JVM。但是,我认为 JVM 变得好坏参半,因为结果很糟糕。

希望你能理解我的问题,非常感谢一些帮助。

【问题讨论】:

你的意思是JVM和在不同线程中运行的进程是一样的? JVM我的意思是不同的进程,每个JVM代表一个java.exe进程 【参考方案1】:

这里有一些想法:

假设一个进程类 - CustomProcess.java。这在一个单独的线程中运行。该类有一个构造函数,它将文件夹作为参数。让我们假设 filePath1 是文件夹的路径,并从 FileChooser 接受。

(a) 应用程序的工作原理:

将选定的文件夹filePath1 放在一个集合中,例如List<File>List<Path> - 我们称之为processFilesList;这是由所有进程共享的(可能是static 成员)(这需要是来自java.util.concurrent 包的并发集合)。此列表跟踪已在处理的文件夹。在进程开始之前检查filePath1 是否已经在processFilesList 中。

(b) 创建并启动流程:

CustomProcess p1 = new CustomProcess(filePath1);
p1.startProcess(); // here the application does whatever with the files in the folder.

选项 2

将所有需要处理的文件夹文件路径放在一个Queue集合中。一次或通过多个进程处理每个文件夹(及其所需的文件)。队列可以是先进先出 (FIFO) 或后进先出 (LIFO)。可以根据需求考虑这些并发队列实现:ConcurrentLinkedQueueLinkedBlockingQueueConcurrentLinkedDequeLinkedBlockingDeque

【讨论】:

以上是关于将文件/“文件夹”锁定到特定的 JVM 并在锁定时进行迭代的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 htaccess 文件锁定文件夹?

如何在启动应用程序时锁定方向并在导航到 Viewcontroller 时解锁它

使用 Java JDBC 写入时 VSAM 文件锁定

创建锁定文件时防止竞争条件

锁定文件以防止多个用户访问它的最佳方法是啥

如何将 S3 存储桶锁定到特定用户和 IAM 角色