1

常に書き込みを行っている別のJavaプロセスのログファイルを監視しています。これらの2つのプロセス(監視アプリケーションと監視対象アプリケーション)は、Linuxディストリビューションのcentosで実行されています。

問題は、監視対象アプリケーションを再起動するたびに、監視対象アプリケーションで次のエラーが発生するように見えることです。

java.io.IOException:FileMonitorのLogMonster.fileChanged(LogMonitor.java:57)のjava.io.RandomAccessFile.read(RandomAccessFile.java:361)のjava.io.RandomAccessFile.readBytes(ネイティブメソッド)での入力/出力エラー.fireFileChangeEvent(FileMonitor.java:96)at FileMonitor $ FileMonitorTask.run(FileMonitor.java:128)at java.util.TimerThread.mainLoop(Timer.java:512)at java.util.TimerThread.run(Timer.java: 462)

キーとしてファイル名、値としてRandomAccessFileオブジェクトを使用してマップを保持し、このオブジェクトをリスナーとして追加した後、次のようにデータを設定します。

monitor.addFileChangeListener(logMonitor、LogFileName、LogMonitor_Properties.getTimeDelay()); randomAccessFile_list.put(LogFileName、new RandomAccessFile(LogFileName、 "r"));

ファイルが変更されるたびにイベントが発生し、監視対象のアプリケーションが再起動された後(再起動される前は正常に機能します)、RandomAccessFileからコンテンツを読み取ろうとしているのはeventFired関数内です。

'fileChanged'関数内の次のコード行がエラーの原因です。

randomAccessFile_list.get(file.getAbsolutePath())。read(byteArray);

bashスクリプトを使用して、アプリケーションのすべてのバージョンを強制終了し、「go」ファイルで再起動します。

goの内容:

cd / path / to / app

。/殺す

nohup ./app.run&

キルの内容:

kill -9 $(lsof app.run | awk'{print $ 2}')

kill -9 $(lsof app.log | awk'{print $ 2}')

kill -9 $(lsof app.go | awk'{print $ 2}')

app.runの内容:

./app.go >> app.log 2>&1

app.logの内容:アプリケーションのテキスト出力のみ。

app.goの内容:

。/path/to/some/other/location/setClassPath.go

CLASSPATH =$CLASSPATHをエクスポートします

エコー$CLASSPATH

/usr/local/jdk1.6.0_27/bin/java -cp $ CLASSPATH MyApp

あなたがそれを読む前に疲れ果てているように見える質問を投稿することをお詫びします、しかし私は本当に私の知恵の終わりにいます、そしてどんな助けでも大いに感謝されます。

前もって感謝します。

4

1 に答える 1

1

メソッド名から、これをファイル監視に使用しているように見えます。それは実際にはファイルを開いているのではなく、たまにそれを統計しているだけです。

次に、マップ内のファイルに対して別のファイルハンドルを開いたままにします。

ライブラリは、変更された時刻が変更された場合にのみイベントを発生させます。これは、ファイルに新しいデータが追加されたことを意味するものではありません。次に、ファイルハンドルから読み取ろうとして、IO例外を取得しようとしているようです。

このアプローチには多くの問題がありますが、コードをもっと見ることなくして、問題が何であるかを正確に伝えることは不可能です。監視対象のプロセスが、ファイルの再起動時にファイルを切り捨てたり、削除したり、何か他のことを行ったりして、開いているファイルハンドルを無効にしていると推測しています。

このようなファイル監視は、通常、「テール」を実行するためではなく、ファイル全体(通常はプロパティファイルまたは編集中のドキュメント)をリロードする場合に使用されます。

于 2012-08-17T16:00:41.277 に答える