Tailer не останавливайся

В моей программе реализован tailerListener, но когда я его запускаю, он никогда не останавливается.

Вот моя программа:

public class PostClient{

private static File file = new File("../file.txt");

public static void main(String [] args){    

//      TAILER LISTENER
    TailerListenerAdapter listener = new MyTailerListener();
    Tailer tailer = new Tailer(file, listener, 500);

    Executor executor = new Executor() {
          public void execute(Runnable command) {
              command.run();
           }
    };

    System.out.println("Execution of the tailer");
    executor.execute(tailer);
    System.out.println("Stop tailer");
    tailer.stop(); 

с моим классом MyTailerListener

import org.apache.commons.io.input.TailerListenerAdapter;

public class MyTailerListener extends TailerListenerAdapter {
    public void handle(String line) {
        System.out.println(line);
    }
}

Вначале мне удалось перейти к tailer.stop (так что моя программа остановилась, отлично), но после написания некоторых других строк и прикосновения к нескольким вещам, он больше не работал.

Странная вещь, когда я заменяю свой класс MyTailerListener на:

public void handle(String line) {
    final String logEntryPattern = "(\\w+\\s+\\d+\\s+\\d{2}:\\d{2}:\\d{2})\\s+(\\S+)\\s+(\\S+):\\s+(.+)";
    final Pattern p = Pattern.compile(logEntryPattern);
    final Matcher matcher = p.matcher(line);

System.out.println("Total groups: " + matcher.groupCount());
System.out.println("Date&Time: " + matcher.group(1));
System.out.println("Hostname: " + matcher.group(2));
System.out.println("Program Name: " + matcher.group(3));
System.out.println("Log: " + matcher.group(4));
}

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

Я думаю, что из-за этого не может найти matcher.group(1). Когда я удаляю все sysout, кроме первого, моя программа не останавливается.

1 ответ

Как вы реализовали Executor, тейлер запускается в том же потоке. Что вы, вероятно, хотите сделать, это создать новый поток для выполнения MyTailerListener. Попробуйте, например,.

Thread tailerThread=new Thread(tailer);
tailerThread.start();
System.out.println("Stop tailer");
tailerThread.stop();

Тем не менее, обратите внимание, что использование Thread.stop() обычно не рекомендуется, поскольку не позволяет потокам завершаться без ошибок. Кроме того, в этом конкретном примере поток может быть прерван до того, как он вообще выполнит какую-либо работу. Вы, вероятно, не хотите этого. Другим быстрым хаком было бы подождать секунду, прежде чем остановить тейлера (например, Thread.sleep(1000);), но вы должны действительно определить, когда (при каких условиях) программа должна быть остановлена, и вместо этого реализовать это чисто.

Другие вопросы по тегам