2015-02-26 27 views
13

Ho un codice funzionante che ascolta una directory che utilizza WatchService e risponde agli eventi che ho specificato. Funziona bene ed è stato testato sia su linux che su mac (anche se su quest'ultimo è chiaro che viene utilizzato il polling).Esiste un modo per forzare il polling utilizzando WatchService?

Tuttavia, quando ho distribuito questo in produzione risulta che la directory da monitorare è una montatura NFS. Poiché WatchService utilizza inotify quando è in esecuzione su Linux, non sono mai stati attivati ​​eventi perché NFS mounts non attiva eventi inotify (o qualcosa del genere, ci sono più informazioni qui, che spiegano il mio problema: Java WatchService not generating events while watching mapped drives).

Poiché il mio codice è già stato scritto, preferirei forzare WatchService a utilizzare l'implementazione di polling anziché quella di inotify. C'è un modo per fare questo?

Ho cercato di trovare il codice sorgente sun.nio.fs.PollingWatchService e creare direttamente un oggetto (invece di usare FileSystems.getDefault(). NewWatchService()) ma quando ho registrato il servizio con il percorso ho ottenuto questa eccezione : java.nio.file.ProviderMismatchException.

Quindi, qualche idea? Poiché ho già implementato il codice utilizzando l'API WatchService e WatchKey, sarebbe molto più semplice forzare il polling piuttosto che riscrivere tutto usando un poller personalizzato o di terze parti. Grazie!

+0

Questa è una specie di lento e inefficiente, ma che dire di 'File f = new File (YOUR_DIRECTORY, "_garbage.tmp"); nuovo FileOutputStream (f) .close(); f.delete(); 'e basta ascoltare la creazione di file chiamati' "_garbage.tmp" '? –

+0

@k_g: Grazie per la risposta, ma non capisco come ciò possa essere d'aiuto. Qualche possibilità che potresti elaborare? – rjcarr

+0

Se si crea un file e lo si elimina, dovrebbe generare un evento WatchService, giusto? –

risposta

2

Puoi provare il progetto open source jpoller. Implementa una classe denominata DirectoryPoller che periodicamente esegue il polling dei contenuti di una o più directory. È un thread periodico che cerca i nuovi file utilizzando il tempo dell'ultima modifica del file. Per scaricare l'origine è possibile visitare http://jpoller.sourceforge.net/ Onestamente, non ho usato jpoller. Ho usato gli eventi JDK 7 WatcherService.