2011-05-18 19 views
1

私は自分のログファイルを監視するためにjava taillistenerを使用しています。ログファイルが更新されると、ログメッセージを出力します。より多くのファイル(たとえば10個のファイル)を監視しようとすると、ログファイルでログが更新されてもコンソールにメッセージは表示されません。私のコードは以下のとおりです。java taillistenerで、より多くのログファイルを処理する方法

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

このコードはコンパイルされません。 7行目は有効なJavaではありません。実際のコードスニペットを提供してくれれば助けになるでしょう。ハッキングされたものではありません。 –

+0

これは私の本当のスニペットです。単に "}"を削除しました。 – ssbecse

+0

'ScheduledThreadPoolExecutor logMonitorThreadPoolExec.scheduleWithFixedDelay(logMessages、5、20、TimeUnit.SECONDS);'は有効なJava文でも有効なJava宣言でもありません。 –

答えて

1

私は、あなたが間違った方法でテイラーを使用していることが問題だと思います。

実行者サービスのスレッドプールを使用してテイラーを使用しようとしています。しかし、テイラは、外部から何かがTailer.stop()と呼ばれるまで、それがrun()メソッドから抜けることがないというプロパティを持っています。そしてあなたのコードでは、それは起こりません。

さらに悪いことに、ScheduledThreadPoolExecutorを使用し、20秒ごとに新しいテイラースレッドを開始するように指示しています。

それで、最初にN Tailerが実行されると、それぞれがエグゼキュータサービスのスレッドの1つを取得し、永遠にハングします。すべてのスレッドが使用中の場合、エグゼキュータはスレッドの1つが終了するのを待ちますが、それは起こりません。

解決方法は、専用のスレッドで各Tailerインスタンスを実行することです。有限スレッドプールからスレッドを使用しようとするべきではありません。プールを使い果たしてしまうからです。基本的には同じ理由で、エグゼキュータ・サービスの使用を試みるべきではありません。


専用スレッドを使用しても機能しない場合、私は考えが尽きます。 Tailerコードを実際に見たり、デバッガでアプリケーションを実行して、Tailerスレッドが実際に行っていることを確認する必要があります。

+0

また、次のコードを試しました.if(listOfFiles [i] .isFile()) { files = listOfFiles [i] .getName(); \t \t \t \t \t \t \t ファイルpcounter_log =新しいファイル(ファイル); \t \t \t \t \t \t \t \t TailerListenerリスナー=新しいFileListener(ファイル、element.getLogPattern()); テイラーテイラー=新しいテイラー(pcounter_log、リスナー、5000); スレッドスレッド=新しいスレッド(テイラー); thread.start(); } }でも、私は同じ問題に直面しています – ssbecse

+0

ファイル名は正しいですか?各テーラを起動する前に 'file.exist()'をチェックしてみてください。 –

関連する問題