0

kann mir jemand sagen, wie man eine Apache commons configuration2 Eigenschaften neu laden. Ich kann nirgendwo eine Implementierung finden. Die Apache Docs sind ein bisschen zu abstrakt. Das habe ich bisher, aber es funktioniert nicht.Wie neu laden Apache Commons Konfigurationen2 Eigenschaften

CombinedConfiguration cc = new CombinedConfiguration(); 

    Parameters params = new Parameters(); 
    File configFile = new File("config.properties"); 
    File emsFile = new File("anotherconfig.properties"); 

    ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> configBuilder = 
     new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class) 
     .configure(params.fileBased() 
      .setFile(configFile)); 
    PeriodicReloadingTrigger reloadTrg = new PeriodicReloadingTrigger(configBuilder.getReloadingController(), null, 5, TimeUnit.SECONDS); 
    reloadTrg.start(); 

    cc.addConfiguration(configBuilder.getConfiguration()); 

    FileBasedConfigurationBuilder<FileBasedConfiguration> emsBuilder = 
      new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class) 
      .configure(params.properties() 
       .setFile(emsFile)); 
    cc.addConfiguration(emsBuilder.getConfiguration()); 

    DataSource ds = EmsDataSource.getInstance().getDatasource(this); 

    BasicConfigurationBuilder<DatabaseConfiguration> dbBuilder = 
     new BasicConfigurationBuilder<DatabaseConfiguration>(DatabaseConfiguration.class); 
    dbBuilder.configure(
     params.database() 
      .setDataSource(ds) 
      .setTable("EMS_CONFIG") 
      .setKeyColumn("KEY") 
      .setValueColumn("VALUE") 
    ); 
    cc.addConfiguration(dbBuilder.getConfiguration()); 

Antwort

0

Die von einem Builder abgerufene Konfiguration wird nicht automatisch aktualisiert. Sie müssen die Konfiguration jedes Mal vom Builder abrufen, wenn Sie sie lesen.

Von Automatic Reloading of Configuration Sources:

Ein wichtiger Punkt im Auge zu behalten, wenn dieser Ansatz Nachladen ist, dass Reloads nur funktionell sind, wenn der Bauherr als zentrale Komponente verwendet wird, Konfigurationsdaten für den Zugriff. Die vom Builder erlangte Konfigurationsinstanz wird nicht automatisch geändert! Wenn also eine Anwendung beim Start ein Konfigurationsobjekt vom Builder abruft und es dann während seiner gesamten Lebensdauer verwendet, werden Änderungen an der externen Konfigurationsdatei nie sichtbar. Der korrekte Ansatz besteht darin, einen Verweis auf den Builder zentral zu führen und die Konfiguration von dort aus jedes Mal zu erhalten, wenn Konfigurationsdaten benötigt werden.

0

Verwendung folgenden Code:

@Component 
public class ApplicationProperties { 
    private PropertiesConfiguration configuration; 

    @PostConstruct 
    private void init() { 
     try { 
      String filePath = PropertiesConstants.PROPERTIES_FILE_PATH; 
      System.out.println("Loading the properties file: " + filePath); 
      configuration = new PropertiesConfiguration(filePath); 

      //Create new FileChangedReloadingStrategy to reload the properties file based on the given time interval 
      FileChangedReloadingStrategy fileChangedReloadingStrategy = new FileChangedReloadingStrategy(); 
      fileChangedReloadingStrategy.setRefreshDelay(PropertiesConstants.REFRESH_DELAY); 
      configuration.setReloadingStrategy(fileChangedReloadingStrategy); 
     } catch (ConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String getProperty(String key) { 
     return (String) configuration.getProperty(key); 
    } 

    public void setProperty(String key, Object value) { 
     configuration.setProperty(key, value); 
    } 

    public void save() { 
     try { 
      configuration.save(); 
     } catch (ConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 
}