2014-12-03 3 views
1

Я пишу очередь сообщений, но она работает медленно, метод processFile занимает слишком много времени, и файлы застревают в очереди в течение длительного времени. Как этого избежать.Message Queue slow performance

System.out.println("Message Reader Started...."); 
    do 
    { 
     String directoryPath = "C:\\Queue"; 
     int fileCount = new File(directoryPath).list().length; 
     if (fileCount < 1) { 
      System.out.println("Files Not Present"); 
     } 
     else 
     { 
      File[] file = new File(directoryPath).listFiles(); 
      String firstFile = file[0].getAbsolutePath(); 
      processFile(firstFile);    
     }      
    } while (true); 
+0

Гарантийный заказ на listFiles() отсутствует, и вы можете прочитать файл, который не был полностью написан. Я предлагаю вам прочитать все файлы (а не только «первый») и обрабатывать только те, которые не обновлялись за 10 или 60 секунд. –

+0

хороший отзыв спасибо @PeterLawrey – prsutar

ответ

1

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

  • делать в то время как цикл в основном потоке находит файл для чтения
  • файла процесса делегируется исполнитель резьбы для обработки
  • и после обработки (я при чтении файла), обработка содержимого может быть выполнена параллельно. Его как читать первые 1000 строк и делегировать поток для обработки.

Вам нужно разработать его лучше, чтобы работать быстро. Однопоточный файл чтения и обработки файлов должен работать медленно.

+0

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

+0

читайте о сервисе исполнителя. это поможет вам. u не нужно создавать потоки самостоятельно. – Nazgul

0

Ваша основная проблема - возможно использование ЦП, используемое для сканирования папки.

В конце цикла вы должны добавить Thread.sleep(100);, чтобы дать системе некоторое время дышать.

Проблема, которую вы хотите решить, является, очевидно, способом processFile(). Вы должны сделать так, как это прокомментировал @Nazgul и реализовать его в своем классе с помощью интерфейса Runnable.

Чтобы ограничить количество выполняемых потоков, поместите имя файла в список или очередь и реализуйте Thread, работающий над List. Вы можете добавить столько рабочих потоков, сколько может обрабатывать ваша система. Очередь должна быть синхронизирована, чтобы вы могли безопасно удалять элементы из нескольких потоков одновременно.

0

Вы написали бесконечный цикл, так почему вы беспокоитесь, как долго проходит одна итерация?

Вам не нужно читать директорию дважды за итерацию. Предполагая, что ваш processFile удаляет обработанный файл (и, возможно, другой поток или процесс добавляет некоторые файлы, но не удаляет их), вам не нужно читать каталог на каждой итерации.

Прочтите его один раз и обработайте все найденные файлы. Если их нет, повторите чтение каталога. Если их все еще нет, вы можете некоторое время (или подумать об watching каталоге, но это немного сложнее и, возможно, не обязательно).

Я настоятельно рекомендую улучшить вашу петлю, прежде чем вы начнете играть с помощью протектора (тогда используйте ExecutorService, как предложено).