0

quelqu'un peut-il me guider sur la façon d'effectuer un rechargement d'un apache commons configuration2 propriétés. Je suis incapable de trouver une implémentation de cela n'importe où. Les docs apache sont un peu trop abstraits. C'est ce que j'ai jusqu'ici mais ça ne marche pas.Comment recharger apache commons configurations2 propriétés

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()); 

Répondre

0

La configuration obtenue à partir d'un générateur n'est pas mise à jour automatiquement. Vous devez obtenir la configuration du constructeur chaque fois que vous le lisez.

De Automatic Reloading of Configuration Sources:

Un point important à garder à l'esprit lors de l'utilisation de cette approche est que le rechargement rechargements sont fonctionnels si le constructeur est utilisé comme élément central pour accéder aux données de configuration. L'instance de configuration obtenue du constructeur ne changera pas automagiquement! Ainsi, si une application extrait un objet de configuration du générateur au démarrage et l'utilise ensuite tout au long de sa durée de vie, les modifications apportées au fichier de configuration externe ne sont jamais visibles. L'approche correcte consiste à conserver une référence au constructeur de manière centralisée et à obtenir la configuration à partir de là chaque fois que des données de configuration sont nécessaires.

0

utilisez le code suivant:

@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(); 
     } 
    } 
}