并行读取Windows共享目录中的文件

我有一个服务器,从Windows共享目录中读取文本文件的列表,并将其内容保存到数据库,然后开始接受用户消息。 该服务器将一次在多台机器上运行。

我看到,当我在多台机器上运行服务器时,开始处理文件的服务器首先处理所有文件,而其他服务器一直等待访问该目录中的文件。

我的代码这样做 – (由于安全策略,不能发布代码)

  1. 获取共享目录中的所有文件列表。
  2. 按修改date对其进行sorting(其保存时间系列数据)
  3. (true)直到目录中存在更多的文件
  4. 获取列表中的第一个文件,并将其移动到InProgess文件夹并阅读
  5. 将内容保存到数据库。
  6. 将文件移到归档目录。
  7. 处理下一个文件。

我看到,当我在两台不同的机器上运行相同的程序时,其中一个首先获得文件的保存并加载它们。 另一个人一直在等待处理文件,如果它find一个句柄,他们已经被处理。 所以它继续前进。

我的目标是在两台或多台机器上运行并行处理所有文件并更快完成。 目前我正在使用磁盘上的500个文件进行testing,但是在任何时候我都可以在磁盘上有更多的文件。

伪代码 –

if(files exist on disk){ LOGGER.info("Files exist on disk. Lets process them up first...."); while (true) { File dir = new File(directory); List<File> fileList = new LinkedList<File>(Arrays.asList(dir.listFiles((FileFilter)FileFileFilter.FILE))); LOGGER.info("No of files in this process: "+ sortedFileList.size()); if (fileList.size() > 0) { Collections.sort(fileList, new Server().new FileComparator()); File file = fileList.get(0); //If I cannot rename the file in the same directory, the file maybe open and I move to the next file if(!file.renameTo(file.getAbsoluteFile())) { LOGGER.info("Read next file..."); continue; } LOGGER.info("Get file handle..."); if (file.exists()) { File inprogressFile = new File(dataDirName + FileBackupOnDisk.INPROGRESS + fileName); saveToDB(inprogressFile); if (savedToDB) if(inprogressFile.renameTo(new File(dataDirName+ARCHIVE+fileName))) LOGGER.info("Moved file to archive - " + fileName); else LOGGER.error("Move file " + fileName + " to failed directory!"); } } } } 

这是我的文件比较代码。 这不能打开文件 –

 final Map<File, Long> staticLastModifiedTimes = new HashMap<File,Long>(); for(final File f : sortedFileList) { staticLastModifiedTimes.put(f, f.lastModified()); } Collections.sort(sortedFileList, new Comparator<File>() { @Override public int compare(final File f1, final File f2) { return staticLastModifiedTimes.get(f1).compareTo(staticLastModifiedTimes.get(f2)); } }); 

如何确保在不同机器上运行的服务器/多个服务器能够直接并行访问共享。 现在看起来像第二个进程发现,目录中存在的文件,但一直等待得到一个文件句柄挂起。

让我知道如果有人之前做过,怎么做?

我发现上面的解决方案完美无缺! 只是在网络中运行一个来自我的eclipse的实例和另一个来自am / c的实例导致了这个延迟问题。 如果我运行与2台机器在同一个网络的程序,它工作正常。 只是我的电脑比较慢 两个实例在读取文件时都能读取文件。 感谢大家的帮助。