[英]in java taillistener, how to handle more log files
我正在使用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);
}
}
你能帮我解决这个问题吗?
我认为问题在于您使用拖尾的方式错误。
您正在尝试通过执行程序服务的线程池使用拖尾程序。 但是Tailer具有的属性是直到外部调用Tailer.stop()
,它才会从run()
方法退出。 在您的代码中,这不会发生。
更糟糕的是,您正在使用ScheduledThreadPoolExecutor
,并告诉它每20秒启动一个新的Tailer线程!
因此,将会发生的事情是,排定的前N个Tailer
运行将各自抓住执行者服务的一个线程...并永远挂在其上。 当所有线程都在使用中时,执行器将等待其中一个线程完成...而这不会发生。
解决方案是在自己的专用线程中运行每个Tailer实例。 您不应该尝试使用有限线程池中的线程,因为您将耗尽该池。 而且出于相同的原因,您不应该尝试使用执行程序服务。
如果使用专用线程不起作用,那我就没主意了。 您需要自己看一下Tailer代码和/或在调试器下运行您的应用程序,以便可以看到Tailer线程实际在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.