我有一个服务器,它从Windows共享目录中读取文本文件列表,并在开始接受用户消息之前将其内容保存到db。该服务器将同时在多台计算机上运行。
我看到当我在多台机器上运行服务器时,开始处理文件的服务器首先处理所有文件,其他文件继续等待访问该目录中的文件。
我的代码执行此操作 - (由于安全策略而无法发布代码)
我看到当我在两台不同的机器上运行相同的程序时,其中一台机器首先获取文件并加载它们。另一个一直在等待处理文件,如果找到了句柄,它们就已经被处理了。所以它继续前进。
我的目标是让这个过程在两台或多台机器上运行,以并行处理所有文件并更快地完成。目前我正在测试磁盘上有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中存在文件但挂起一点等待获取文件句柄。
如果有人之前已经这样做了,请告诉我以及如何做到这一点?
答案 0 :(得分:0)
我发现上面的解决方案完美无缺!!!! 它只是从我的eclipse运行一个实例而另一个从网络中的m / c运行导致这种延迟问题。 如果我在同一网络中使用2台机器运行该程序,它可以正常工作。只是我的电脑速度慢了。两个实例在获取文件时都能读取文件。 感谢大家的帮助。