从Windows共享目录并行读取文件

时间:2015-01-27 00:28:26

标签: java windows file process parallel-processing

我有一个服务器,它从Windows共享目录中读取文本文件列表,并在开始接受用户消息之前将其内容保存到db。该服务器将同时在多台计算机上运行。

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

我的代码执行此操作 - (由于安全策略而无法发布代码)

  1. 获取共享目录中所有文件的列表。
  2. 按修改日期(保存时间序列数据)对其进行排序
  3. 虽然(true)直到目录中存在更多文件
  4. 获取列表中的第一个文件,并将其移至InProgess文件夹并阅读
  5. 将内容保存到数据库。
  6. 将文件移至档案目录。
  7. 处理下一个文件。
  8. 我看到当我在两台不同的机器上运行相同的程序时,其中一台机器首先获取文件并加载它们。另一个一直在等待处理文件,如果找到了句柄,它们就已经被处理了。所以它继续前进。

    我的目标是让这个过程在两台或多台机器上运行,以并行处理所有文件并更快地完成。目前我正在测试磁盘上有500个文件,但我可以在任何给定时间在磁盘上有更多文件。

    PseudoCode -

    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));
        }
    });
    

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

    如果有人之前已经这样做了,请告诉我以及如何做到这一点?

1 个答案:

答案 0 :(得分:0)

我发现上面的解决方案完美无缺!!!! 它只是从我的eclipse运行一个实例而另一个从网络中的m / c运行导致这种延迟问题。 如果我在同一网络中使用2台机器运行该程序,它可以正常工作。只是我的电脑速度慢了。两个实例在获取文件时都能读取文件。 感谢大家的帮助。