[英]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.