1

Java OSGi サービスで Apache JCI の FAM (FileAlterationMonitor) を使用して、FileSystem の変更を監視および処理しています。サービスを開始するたびに (以下のコードを使用して FAM を開始します)、FAM はディレクトリに存在するすべての変更を取得します。

現在、私は /tmp を見ています /tmp にはサブツリーが含まれています: /tmp/foo/bar/cat/dog

サービスを開始して FAM を開始するたびに、以下の DirectoryCreate イベントが報告されます。

/tmp/foo
/tmp/foo/bar
/tmp/foo/bar/cat
/tmp/foo/bar/cat/dog

そのサブツリーのどの部分にも変更が加えられていない場合でも。

サービスのアクティベーション時に実行されるコード:

File watchFolder = new File("/tmp"); 
watchFolder.mkdirs();

fam = new FilesystemAlterationMonitor();
fam.setInterval(1000);
fam.addListener(watchFolder, listener);
fam.start();
// I've already tried adding:
listener.waitForFirstCheck();

リスナーの例:

private FileChangeListener listener = new FileChangeListener() {
    public void onDirectoryChange(File pDir) { System.out.println(pDir.getAbsolutePath()); }
    public void onDirectoryCreate(File pDir) { System.out.println(pDir.getAbsolutePath()); }
    ...
}
4

2 に答える 2

1

はい、これは JCI の非常に厄介な機能の 1 つです。監視が開始されると、 への呼び出しで検出されたすべてのファイルとディレクトリが通知されますonXxxCreate()。以下の選択肢があると思います

  • FileChangeListener監視を開始したら、JCI からのイベントを実際に処理する前に、コールバックの実装でしばらく (数秒) 待ちます。それは私がプロジェクトで行ったことであり、かなりうまく機能しますが、「猶予期間」内に発生した実際のファイル作成を見逃す可能性があります
  • JCI のソースを取得し、監視の起動時にファイルとディレクトリが見つかった場合にのみ起動される2 つの新しいイベント メソッドonDirectoryFound(File)を使用するように変更します。onFileFound(File)
  • スレッドを開始して定期的java.nio.file.WatchServiceにチェックするのではなく、OS から変更を通知するために内部でネイティブ メソッドを使用するため、IMO が最適なオプションです。JCI では、変更がコールバックに反映されるまで数秒の範囲の遅延が発生する場合があります。
于 2011-12-23T11:07:42.687 に答える
0

WatchService のことは忘れてください。直感的ではなく、監視しているフォルダーが削除または変更されたことを検出できるかどうかを確認しようとするときに問題があります。私はそれから遠く離れていました。私は Watcher を使ってきましたが、Apache IO の方がずっと好きです。Camelもそれを使用していると思います。

于 2014-11-26T19:28:28.730 に答える