2015-01-27 3 views
2

У меня есть сервер, который читает список текстовых файлов из общего каталога Windows и сохраняет его содержимое в db, прежде чем он начнет принимать сообщения пользователя. Этот сервер будет работать одновременно на нескольких компьютерах.Параллельно просматривает файлы из общего каталога Windows

Я вижу, что, когда я запускаю сервер на нескольких компьютерах, сервер, который начинает обработку файлов, сначала обрабатывает все файлы, а остальные продолжает ждать доступа к файлам в этом каталоге.

Мой код делает это - (не может отправлять код из-за политики безопасности)

  1. Получить список всех файлов в общем каталоге.
  2. Сортировать их по модифицированной дате (его данные серии экономии времени)
  3. Хотя (правда) до более файлов существует в каталоге
  4. Получить первый файл в списке, и переместить его в папку InProgess и читать
  5. Сохраните содержимое в базе данных.
  6. Переместить файл в каталог архива.
  7. Обработать следующий файл.

Я вижу, что, когда я запускаю ту же программу на двух разных машинах, один из них сначала захватывает файлы и загружает их все. Другой продолжает ждать, чтобы получить дескриптор файлов, и если он найдет дескриптор, они уже обработаны. Поэтому он движется дальше.

Моя цель состоит в том, чтобы процесс выполнялся на обеих машинах, чтобы обрабатывать все файлы параллельно и заканчивать быстрее. На данный момент я тестирую 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)); 
    } 
}); 

Как я могу убедиться, что оба мои сервера/несколько серверов, работающих на разных машинах могут получить доступ к общим непосредственно параллельно. Сейчас похоже, что 2-й процесс обнаружил, что файлы существуют в каталоге, но висят в какой-то момент, ожидая получения дескриптора файла.

Сообщите мне, если кто-либо сделал это раньше и как?

+0

Проблема заключается в том, что, когда код не может открыть файл, он продолжает пытаться, пока не сможет, что, конечно, не произойдет, пока файл уже не обработан. Код должен пропустить любые файлы, которые он не может открыть, пока не найдет тот, который он может. –

+0

Это не выходит за рамки сортировки в процессе, который начался 2-го. Даже если я прокомментирую строку 'code' Collections.sort (fileList, новый Server().новый FileComparator()), 'code', он никогда не выполняет строки после этого. Я могу поместить часть в 'code'continue;' code', если file.exists() не является истинным, но никогда не пересекает эту точку. – PS5

+0

Я бы предположил, что вы открываете файлы в 'FileComparator'? Во всяком случае, в вашей логике должна быть ошибка. Windows не позволяет нескольким машинам одновременно считывать файлы из одного и того же каталога. Если вы можете определить точку в своем коде, где она ждет дескриптора файла, который может помочь, поскольку он не должен вообще пытаться открыть файл в этой точке. (Возможно, какой-нибудь Java API, который вы используете для получения дат изменения, открывает файл?) –

ответ

0

Я узнал, что мое решение выше работает отлично! Его просто то, что запуск одного экземпляра из моего затмения с другим из m/c в сети вызывал такие проблемы с задержкой. Если я запускаю программу с двумя машинами в той же сети, она отлично работает. Просто мой компьютер был медленнее. Оба экземпляра, читающие файлы, когда они получают, могут обращаться с ним. Спасибо вам за помощь.

Смежные вопросы