2016-12-01 4 views
3

Mit org.apache.commons:commons-configuration2:2.1 meine Anwendung muss wissen, wenn eine Konfigurationsdatei neu geladen wurde, so dass es einige Dinge im Programm aktualisieren kann. Apache Commons Configuration2 verwendet viele Strategien und Fabriken, und normalerweise ist das großartig, aber hier wird es so kompliziert, dass ich nicht herausfinden kann, wo ich einen Listener installieren muss.Ermitteln Datei neu laden in Apache Commons Konfiguration2

Die Anwendung hat dies:

configConfigurationBuilder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
    PropertiesConfiguration.class) 
     .configure(new Parameters().properties().setFile(getConfigFile())); 
final PeriodicReloadingTrigger configReloadingTrigger = new PeriodicReloadingTrigger(
    configConfigurationBuilder.getReloadingController(), null, 1, TimeUnit.MINUTES); 
configReloadingTrigger.start(); 

Welche dieser verschiedenen Dinge kann ich einen Hörer auf installieren? Ich möchte nur benachrichtigt werden, wenn die Konfigurationsdatei neu geladen wird.

Ich bemerke, dass die ReloadingDetector Schnittstelle eine reloadingPerformed() Methode hat, und das klingt wie, was ich will. Aber wie füge ich meinen eigenen ReloadingDetector hinzu? Es scheint, als ob die ReloadingController nur eine ReloadingDetector herumhält. Sicherlich muss ich keine Unterklasse ReloadingDetector und installieren Sie eine benutzerdefinierte, würde ich? Ich möchte die Neuladeerkennung nicht spezialisieren, daher wäre Unterklassen nicht geeignet --- Ich möchte nur benachrichtigt werden, wenn etwas passiert. Außerdem ist es für mich nicht offensichtlich, wo ich mich sogar in die Kette von Ereignissen einklinken würde, wo es einen internen Faktor benutzt, um den Detektor zu erzeugen.

Also wie kann ich Apache Commons Configuration2 leicht erhalten, um mich zu benachrichtigen, wenn es eine Konfiguration neu lädt?

Antwort

1

Ich stellte diese Frage an die Apache Commons mailing list und Oliver Heger antwortete:

Sie können einen Event-Listener am ReloadingController hinzufügen, dann Sie Benachrichtigungen vom Typ ReloadingEvent erhalten.

Alternativ können Sie auch einen allgemeineren Listener für Ereignisse im Konfigurations-Generator selbst registrieren. Wenn die vom Builder verwaltete Konfiguration zurückgesetzt wird, wird ein entsprechendes Ereignis erzeugt. Dies geschieht auch während eines Nachladevorgangs.

Zuerst war ich verwirrt darüber, ob diese Ereignisse gesendet werden, wenn der Bedarf an einem reload erkannt wird oder nach dem Nachladen aufgetreten, aber er erinnerte mich:

Vielleicht ein Missverständnis der Umladung Mechanismus: Neue Daten sind nicht automatisch in ein Konfigurationsobjekt geschoben Sie möglicherweise eine Referenz zu haben. Stattdessen wird der Konfigurationsersteller zurückgesetzt. So die nächste Zeit, die Sie den Builder für eine Konfiguration abfragen, erhalten Sie eine neue mit aktualisierte Daten.

Wenn Sie eines der genannten Ereignisse erhalten, wurde der Builder zurückgesetzt und Sie wissen, dass neue Daten verfügbar sind.

Das war eine nützliche Antwort, die ich teile, um anderen zu helfen. (Ich wünschte, die Apache Commons-Entwickler würden überwacht und waren auf Stack Overflow aktiv.)