2015-02-26 35 views
13

Mam działający kod, który nasłuchuje na katalogu korzystającym z usługi WatchService i odpowiada na określone przeze mnie zdarzenia. To działa dobrze i zostało przetestowane zarówno na Linuksie jak i na Macu (chociaż na tym ostatnim jest oczywiste, że używa się pollingu).Czy istnieje sposób na odpytywanie przy użyciu usługi WatchService?

Jednak, gdy wdrożyłem to w produkcji okazało się, że monitorowany katalog to uchwyt NFS. Ponieważ usługa WatchService używa inotify podczas działania na Linuksie, nigdy nie zdarzały się żadne zdarzenia, ponieważ porty NFS nie wyzwalają zdarzeń inotify (lub coś podobnego, tutaj jest więcej informacji, co wyjaśnia mój problem: Java WatchService not generating events while watching mapped drives).

Ponieważ mój kod jest już napisany, wolałbym zmusić usługę WatchService do korzystania z implementacji odpytywania zamiast do inotify. Czy jest jakiś sposób na zrobienie tego?

Próbowałem tego, znajdując kod źródłowy sun.nio.fs.PollingWatchService i tworząc obiekt bezpośrednio (zamiast za pomocą FileSystems.getDefault(). NewWatchService()), ale przy rejestracji usługi ze ścieżką otrzymałem ten wyjątek : java.nio.file.ProviderMismatchException.

Jakieś pomysły? Ponieważ zaimplementowałem już kod przy użyciu funkcji WatchService i WatchKey API, znacznie łatwiej jest wymusić odpytywanie niż przepisać wszystko za pomocą niestandardowego lub zewnętrznego oprogramowania poller. Dzięki!

+0

Jest to rodzaj powolne i nieefektywne ale co 'pliku f = new File (YOUR_DIRECTORY "_garbage.tmp"); nowy FileOutputStream (f) .close(); f.delete(); 'i po prostu nasłuchuj na tworzenie plików o nazwie' "_garbage.tmp" '? –

+0

@k_g: Dzięki za odpowiedź, ale nie rozumiem, jak to pomaga. Czy była szansa, że ​​mógłbyś to rozwinąć? – rjcarr

+0

Jeśli utworzysz plik, a następnie go usuniesz, powinien wystrzelić zdarzenie WatchService, prawda? –

Odpowiedz

2

Możesz wypróbować jpoller z otwartym kodem źródłowym. Implementuje klasę o nazwie DirectoryPoller, która okresowo odpytuje zawartość jednego lub więcej katalogów. Jest to okresowy wątek, który wyszukuje nowe pliki przy użyciu czasu ostatniej modyfikacji pliku. Aby pobrać źródło, odwiedź http://jpoller.sourceforge.net/ . Szczerze mówiąc, nie użyłem jpoller. Użyłem zdarzeń JDK 7 WatcherService.