в Java Taillistener, как обрабатывать больше файлов журнала - PullRequest
1 голос
/ 18 мая 2011

Я использую Java Taillistener для мониторинга моих файлов журнала. Когда файлы журнала обновляются, он выводит сообщение журнала. Когда запускается один или два файла журнала, он работает нормально. Но при попытке мониторинга большего количества файлов (скажем, 10 файлов)), в консоли не отображаются сообщения, даже журналы обновляются в файле журнала. Мой код приведен ниже.

ScheduledThreadPoolExecutor logMonitorThreadPoolExec;

if (listOfFiles[i].isFile()) 
{
 files = listOfFiles[i].getName();
 File pcounter_log = new File(files);                                
 Tailer logMessages = new Tailer(pcounter_log, new FileListener(files,element.getLogPattern()),
                                        5000, true);
 logMonitorThreadPoolExec.scheduleWithFixedDelay(logMessages, 5, 20,
                        TimeUnit.SECONDS);

}

public class FileListener extends TailerListenerAdapter {

 private final String fileName;

 public FileListener(String fileName, ArrayList<String> pattern) {
    this.fileName = fileName;
 }
  public void handle(String line) {

    System.out.println(fileName+"<---->"+line); 
    }
}

Можете ли вы помочь мне разобраться с этим?

1 Ответ

1 голос
/ 18 мая 2011

Я думаю, что проблема в том, что вы используете Tailer неправильно.

Вы пытаетесь использовать Tailer, используя пул потоков службы исполнителя. Но у Tailer есть свойство не выходить из метода run(), пока что-то внешне не вызовет Tailer.stop(). И в вашем коде этого не произойдет.

Хуже того, вы используете ScheduledThreadPoolExecutor и говорите ему запускать новую нить Tailer каждые 20 секунд!

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

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...