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!
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" '? –
@k_g: Grazie per la risposta, ma non capisco come ciò possa essere d'aiuto. Qualche possibilità che potresti elaborare? – rjcarr
Se si crea un file e lo si elimina, dovrebbe generare un evento WatchService, giusto? –