Verschillen tussen de Java WatchService API en de Apache Commons IO Monitor Library

1. Overzicht

Lang voor de Java WatchService API werd uitgebracht in Java 7, Apache Commons IO Monitoring-bibliotheek behandelde al dezelfde use-case van het controleren van een bestandssysteemlocatie of map op wijzigingen.

In dit artikel gaan we de verschillen tussen de twee API's onderzoeken.

2. Maven afhankelijkheden

Om Apache Commons IO te gebruiken, moet de volgende afhankelijkheid worden toegevoegd in het pom:

 commons-io commons-io 2.5 

En natuurlijk maakt de bewakingsdienst deel uit van de JDK, dus deze heeft geen externe afhankelijkheid nodig.

3. Functievergelijking

3.1. Gebeurtenisgestuurde verwerking

WatchService API wordt aangestuurd door de wijzigingsgebeurtenissen van het bestandssysteem die door het besturingssysteem worden geactiveerd. Deze benadering zorgt ervoor dat de toepassing het bestandssysteem niet herhaaldelijk naar wijzigingen hoeft te ondervragen.

Apache Commons IO Monitor-bibliotheek daarentegen, peilt de locatie van het bestandssysteem met een configureerbaar slaapinterval door de lijstFiles () methode van het dossier klasse. Deze benadering verspilt CPU-cycli, vooral als er geen verandering optreedt.

3.2. Callback-methode

WatchService API biedt geen callback-methoden. In plaats daarvan biedt het twee soorten polling-methoden om te controleren of er nieuwe wijzigingsgebeurtenissen beschikbaar zijn voor verwerking:

  1. Blokkeermethoden zoals poll () (met een time-outparameter) en nemen()
  2. Niet-blokkerende methode zoals poll () (zonder een time-outparameter)

Met de blokkeermethoden begint de applicatiethread pas te verwerken als er nieuwe wijzigingsgebeurtenissen beschikbaar zijn. Daarom hoeft het niet te blijven peilen naar nieuwe evenementen.

De details en het gebruik van deze methoden zijn te vinden in ons artikel hier.

Daarentegen biedt Apache Commons IO-bibliotheek callback-methoden op het FileAlterationListener interface die worden aangeroepen wanneer een verandering in de bestandssysteemlocatie of directory wordt gedetecteerd.

FileAlterationObserver observer = nieuwe FileAlterationObserver ("pathToDir"); FileAlterationMonitor monitor = nieuwe FileAlterationMonitor (POLL_INTERVAL); FileAlterationListener listener = nieuwe FileAlterationListenerAdaptor () {@Override public void onFileCreate (bestandsbestand) {// code voor het verwerken van aanmaakgebeurtenis} @Override public void onFileDelete (bestandsbestand) {// code voor het verwerken van verwijderingsgebeurtenis} @Override public void onFileChange ( File file) {// code voor het verwerken van wijzigingsgebeurtenis}}; observer.addListener (luisteraar); monitor.addObserver (waarnemer); monitor.start ();

3.3. Gebeurtenisoverloop

WatchService API wordt aangestuurd door gebeurtenissen in het besturingssysteem. Daarom bestaat de mogelijkheid dat de buffer van het besturingssysteem die de gebeurtenissen vasthoudt, overloopt als de toepassing de gebeurtenissen niet snel genoeg kan verwerken. In dit scenario is het event StandardWatchEventKinds.OVERFLOW wordt geactiveerd om aan te geven dat sommige van de gebeurtenissen verloren zijn gegaan of verwijderd voordat de toepassing ze kon lezen.

Dit vereist een juiste behandeling van de OVERLOOP gebeurtenis in de toepassing om ervoor te zorgen dat de toepassing elke plotselinge uitbarsting van wijzigingsgebeurtenissen kan verwerken die de OVERLOOP evenement.

De Commons IO-bibliotheek daarentegen is niet gebaseerd op de gebeurtenissen in het besturingssysteem en er is dus geen sprake van overflow.

Bij elke peiling krijgt de waarnemer de lijst met bestanden in de directory en vergelijkt deze met de lijst die is verkregen uit de vorige peiling.

  1. Als er een nieuwe bestandsnaam is gevonden in de laatste peiling, onFileCreate () wordt aangeroepen op de luisteraar
  2. Als een bestandsnaam gevonden in de vorige peiling ontbreekt in de bestandenlijst die is verkregen uit de laatste peiling, onFileDelete () wordt aangeroepen op de luisteraar
  3. Als er een overeenkomst wordt gevonden, wordt het bestand gecontroleerd op elke wijziging in kenmerken zoals de datum van de laatste wijziging, de lengte enz. Als er een wijziging wordt gedetecteerd, onFileChange () wordt aangeroepen op de luisteraar

4. Conclusie

In dit artikel zijn we erin geslaagd om de belangrijkste verschillen tussen de twee API's te benadrukken.

En, zoals altijd, is de volledige broncode voor de voorbeelden die in dit artikel worden gebruikt, beschikbaar in ons GitHub-project.