我有一台服务器,它从Windows共享目录中读取文本文件列表,并在其开始接受用户消息之前将其保存到数据库。该服务器将一次在多台机器上运行。并行读取Windows共享目录中的文件
我看到,当我在多台机器上运行服务器时,开始处理这些文件的服务器首先处理所有文件,其他服务器继续等待访问该目录中的文件。
我的代码做到这一点 - (不能由于安全策略邮编)
- 获取列表中的所有文件的共享目录。
- 您可以按照修改日期(其保存的时间序列数据)
- 虽然(真),直到更多的文件在目录中存在
- 获取列表中的第一个文件,并将其移动到InProgess文件夹和读取
- 将内容保存到数据库。
- 将文件移到归档目录。
- 处理下一个文件。
我看到,当我在两台不同的机器上运行相同的程序时,其中一台机器首先获取文件并将其全部加载。另一个人一直在等待处理这些文件,如果它找到了句柄,则它们已经被处理。所以它继续前进。
我的目标是在两台或多台机器上运行并行处理所有文件并更快完成的过程。现在我正在用磁盘上的500个文件进行测试,但是我可以在任何时候在磁盘上有更多的文件。
伪 -
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中,但是一直等待获取文件句柄。
让我知道如果有人以前做过这个,怎么做?
问题是,当代码无法打开文件时,它会一直尝试下去,直到文件已经被处理,这当然不会发生。代码需要跳过任何无法打开的文件,直到找到可以打开的文件。 – 2015-01-27 02:00:40
它不会超出第二个启动过程中的分类点。即使我评论这行'code' Collections.sort(fileList,new Server())。新的FileComparator());'代码',它从不执行后面的行。如果file.exists()不是真的,我可以放入'code'继续;'code'部分,但它永远不会跨越那个点。 – PS5 2015-01-27 16:09:41
我想你打开'FileComparator'中的文件?无论如何,你的逻辑中肯定存在一个错误。 Windows不会阻止多台机器同时从同一目录中读取文件。如果你可以在你的代码中确定它正在等待文件句柄的地方,这可能会有所帮助,因为它不应该试图在那个时候打开一个文件。 (也许无论您用来检索修改日期的Java API是否会打开文件?) – 2015-01-27 23:10:48