Tailer不会停止

时间:2015-07-20 14:47:47

标签: java apache-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 个答案:

答案 0 :(得分:3)

你实现Executor的方式,tailer在同一个线程中运行。您可能想要做的是创建一个新线程来执行MyTailerListener。尝试例如。

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

但是请注意,通常不鼓励使用Thread.stop(),因为它不允许线程干净地终止。此外,在此特定示例中,线程可能在完成任何工作之前被终止。你可能不想要那个。另一个快速入侵是在停止尾标之前等待一秒钟(例如Thread.sleep(1000);),但是你应该确定何时(在哪些条件下)程序应该被停止并且干净地实现它。