Differenze tra l'API Java WatchService e la libreria di monitoraggio IO di Apache Commons

1. Panoramica

Molto prima che l' API Java WatchService venisse rilasciata in Java 7, la libreria Apache Commons IO Monitoring stava già affrontando lo stesso caso d'uso del monitoraggio di una posizione o directory del file system per le modifiche.

In questo articolo, esploreremo le differenze tra le due API.

2. Dipendenze di Maven

Per utilizzare Apache Commons IO, è necessario aggiungere la seguente dipendenza nel pom :

 commons-io commons-io 2.5 

E ovviamente il servizio di sorveglianza fa parte del JDK, quindi non necessita di dipendenze esterne.

3. Confronto delle caratteristiche

3.1. Elaborazione guidata dagli eventi

WatchService API è guidata dagli eventi di modifica del file system attivati ​​dal sistema operativo. Questo approccio salva l'applicazione dal polling ripetutamente del file system per le modifiche.

La libreria Apache Commons IO Monitor, invece, esegue il polling della posizione del file system a un intervallo di sospensione configurabile chiamando il metodo listFiles () della classe File . Questo approccio spreca i cicli della CPU, soprattutto se non si verificano modifiche.

3.2. Metodo di richiamata

WatchService API non fornisce metodi di callback. Fornisce invece due tipi di metodi di polling per verificare se sono disponibili nuovi eventi di modifica per l'elaborazione:

  1. Metodi di blocco come poll () (con un parametro di timeout) e take ()
  2. Metodo non bloccante come poll () (senza un parametro di timeout)

Con i metodi di blocco, il thread dell'applicazione inizia l'elaborazione solo quando sono disponibili nuovi eventi di modifica. Pertanto, non è necessario continuare a sondare i nuovi eventi.

I dettagli e l'utilizzo di questi metodi possono essere trovati nel nostro articolo qui.

Al contrario, la libreria Apache Commons IO fornisce metodi di callback sull'interfaccia FileAlterationListener che vengono richiamati quando viene rilevata una modifica nella posizione o nella directory del file system.

FileAlterationObserver observer = new FileAlterationObserver("pathToDir"); FileAlterationMonitor monitor = new FileAlterationMonitor(POLL_INTERVAL); FileAlterationListener listener = new FileAlterationListenerAdaptor() { @Override public void onFileCreate(File file) { // code for processing creation event } @Override public void onFileDelete(File file) { // code for processing deletion event } @Override public void onFileChange(File file) { // code for processing change event } }; observer.addListener(listener); monitor.addObserver(observer); monitor.start();

3.3. Overflow di eventi

WatchService API è guidata dagli eventi del sistema operativo. Quindi, esiste la possibilità che il buffer del sistema operativo che contiene gli eventi trabocchi, se l'applicazione non è in grado di elaborare gli eventi abbastanza rapidamente. In questo scenario, viene attivato l'evento StandardWatchEventKinds.OVERFLOW indicando che alcuni eventi vengono persi o eliminati prima che l'applicazione possa leggerli.

Ciò richiede una gestione corretta dell'evento OVERFLOW nell'applicazione per garantire che l'applicazione possa gestire qualsiasi burst improvviso di eventi di modifica che possono attivare l' evento OVERFLOW .

La libreria Commons IO, d'altra parte, non si basa sugli eventi del sistema operativo e quindi non si tratta di overflow.

In ogni sondaggio, l'osservatore ottiene l'elenco dei file nella directory e lo confronta con l'elenco ottenuto dal sondaggio precedente.

  1. Se nell'ultimo polling viene trovato un nuovo nome di file, onFileCreate () viene richiamato sul listener
  2. Se un nome file trovato nel sondaggio precedente non è presente nell'elenco dei file ottenuto dall'ultimo sondaggio, viene richiamato onFileDelete () sul listener
  3. Se viene trovata una corrispondenza, il file viene controllato per qualsiasi cambiamento negli attributi come la data dell'ultima modifica, la lunghezza ecc. Se viene rilevato un cambiamento, onFileChange () viene invocato sul listener

4. Conclusione

In questo articolo siamo riusciti a evidenziare le differenze principali nelle due API.

E, come sempre, il codice sorgente completo per gli esempi utilizzati in questo articolo è disponibile nel nostro progetto GitHub.