我正在使用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);
}
}
你可以帮我解决这个问题吗?
答案 0 :(得分:1)
我认为问题在于你错误地使用了Tailer。
您正在尝试使用执行程序服务的线程池来使用Tailer。但是Tailer有一个属性,它不会退出它的run()
方法,直到外部调用Tailer.stop()
。在您的代码中,这不会发生。
更糟糕的是,你正在使用ScheduledThreadPoolExecutor
,并告诉它每20秒启动一个新的Tailer线程!
所以会发生的事情是,第一个N Tailer
运行计划将各自抓取一个执行程序服务的线程......并永远挂起它。当所有线程都在使用时,执行程序将等待其中一个线程完成......这不会发生。
解决方案是在自己的专用线程中运行每个Tailer实例。您不应该尝试使用来自有限线程池的线程,因为您将耗尽池。并且您不应该尝试使用执行程序服务,原因基本相同。
如果使用专用线程不起作用,我就没有想法了。您需要自己查看Tailer代码和/或在调试器下运行您的应用程序,以便您可以看到Tailer线程实际上在做什么。