2015-02-26 9 views
13

Ich habe funktionierenden Code, der mit WatchService auf ein Verzeichnis wartet und auf die von mir angegebenen Ereignisse reagiert. Dies funktioniert gut und wurde sowohl auf Linux als auch auf Mac getestet (obwohl auf letzterem klar ist, dass Polling verwendet wird).Gibt es eine Möglichkeit zur Abfrage mit WatchService?

Wenn ich dies jedoch in der Produktion bereitgestellt habe, stellt sich heraus, dass das überwachte Verzeichnis ein NFS-Mount ist. Da der WatchService inotify verwendet, wenn er unter Linux ausgeführt wird, wurden niemals Ereignisse ausgelöst, weil NFS-Mounts keine inotify-Ereignisse auslösen (oder so etwas, hier gibt es weitere Informationen, die mein Problem erklären: Java WatchService not generating events while watching mapped drives).

Da mein Code bereits geschrieben wurde, würde ich es vorziehen, den WatchService zu zwingen, die Polling-Implementierung statt der Inotify-Implementierung zu verwenden. Gibt es eine Möglichkeit, dies zu tun?

Ich versuchte dies, indem ich den Quellcode sun.nio.fs.PollingWatchService fand und ein Objekt direkt erstellte (anstatt FileSystems.getDefault() zu verwenden. NewWatchService()), aber beim Registrieren des Dienstes mit dem Pfad habe ich diese Ausnahme bekommen : java.nio.file.ProviderMismatchException.

Also, irgendwelche Ideen? Da ich den Code bereits mit der WatchService- und WatchKey-API implementiert habe, wäre es viel einfacher, die Abfrage zu erzwingen, als alles mit einem benutzerdefinierten oder Drittanbieter-Poller neu zu schreiben. Vielen Dank!

+0

Dies ist eine Art langsam und ineffizient, aber was 'Datei f = new File (YOUR_DIRECTORY "_garbage.tmp"); neu FileOutputStream (f) .close(); f.delete(); 'und lausche nur auf die Erstellung von Dateien namens' "_garbage.tmp" '? –

+0

@k_g: Danke für die Antwort, aber ich verstehe nicht, wie das hilft. Jede Chance, die du ausarbeiten könntest? – rjcarr

+0

Wenn Sie eine Datei erstellen und dann löschen, sollte sie ein WatchService-Ereignis auslösen, richtig? –

Antwort

2

Sie können das Open-Source-Projekt jpoller ausprobieren. Es implementiert eine Klasse namens DirectoryPoller, die regelmäßig den Inhalt eines oder mehrerer Verzeichnisse abfragt. Es ist ein periodischer Thread, der nach neuen Dateien sucht, die die Zeit der letzten Änderung der Datei verwenden. Zum Herunterladen der Quelle können Sie http://jpoller.sourceforge.net/ aufrufen Ehrlich gesagt, ich habe jpoller nicht verwendet. Ich habe JDK 7 WatcherService-Ereignisse verwendet.

Verwandte Themen