2012-04-18 9 views
1

構成管理クラスに問題があり、再ロードされません。構成が再ロードされない

私はあなたに私のコードの一部をお見せしましょう:今、そのコードが完全に正常に動作

public class ConfigurationManager extends XMLConfiguration 
{ 
    private static final Logger log = LoggerFactory.getLogger(ConfigurationManager.class); 

    private static final long serialVersionUID = 1L; 
    public static final String CONFIG_FILE_PATH = "/config.xml"; 
    private static volatile ConfigurationManager instance = null; 
    private static Object lock = new Object(); 

    // Instance management methods 
    public static ConfigurationManager getInstance() 
    { 
     return getInstance(CONFIG_FILE_PATH); 
    } 

    public static ConfigurationManager getInstance(String cfg) 
    { 
     if(instance == null) 
     { 
     synchronized(lock) 
     { 
      if(instance == null) 
      { 
       try 
       { 
        instance = new ConfigurationManager(cfg); 
        instance.dumpConfigurationToLog(); 
       } 
       catch(Exception e) 
       { 
        log.error("Error calling getInstance. Method params", e); 
       } 
      } 
     } 
     } 
     return instance; 
    } 

    private Object loadedCfg; 

    private int reloadInterval; 

    private void dumpConfigurationToLog() 
    { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

     try 
     { 
     this.save(bos); 
     bos.flush(); 
     } 
     catch(Exception e) 
     { 
     log.error("Error calling dumpConfigurationToLog. Method params", e); 
     } 

    } 

    @Override 
    public void configurationChanged(ConfigurationEvent event) 
    { 
     log.info("Enter Method configurationChanged params: {}", event); 
     if(event.isBeforeUpdate() == false) 
     { 
     makeUpdates(); 

     log.info("Configuration file: {} has changed and reloaded...", loadedCfg); 
     dumpConfigurationToLog(); 
     } 
     log.info("Return Method configurationChanged"); 
    } 

    private void updateReloadInterval() 
    { 
     int newReloadInterval = getInt("global.reloadInterval") * 1000; 
     if(reloadInterval != newReloadInterval) 
     { 
     reloadInterval = newReloadInterval; 
     if(getReloadInterval() > 0) 
     { 
      FileChangedReloadingStrategy reloadStrategy = new FileChangedReloadingStrategy(); 
      reloadStrategy.setRefreshDelay(getReloadInterval()); 
      this.setReloadingStrategy(reloadStrategy); 
     } 
     else 
      if(getReloadInterval() == 0) 
      { 
       this.setReloadingStrategy(new InvariantReloadingStrategy()); 
      } 
      else 
      { 
       log.error("Invalid reload interval for ConfigurationManager: {}", getReloadInterval()); 
      } 
     } 
    } 

    private ConfigurationManager(String cfgFile) throws Exception, ConfigurationException 
    { 
     super(); 
     loadedCfg = cfgFile; 
     if(System.class.getResource(cfgFile) != null) 
     this.setURL(System.class.getResource(cfgFile)); 
     else 
     this.setURL(getClass().getResource(cfgFile)); 
     this.load(); 
     makeUpdates(); 
     this.addConfigurationListener(this); 
     this.setThrowExceptionOnMissing(true); 
    } 

    private void makeUpdates() 
    { 
     updateReloadInterval(); 
    } 

    public int getReloadInterval() 
    { 
     return reloadInterval; 
    } 
} 

、私は設定ファイルを読み込み、ノー大きな問題とそれに取り組むことができ、問題はそれを取得しないことです構成の変更が再ロードされました。私はブレークポイントを設定しようとしましたが、それは決してconfigurationChangedメソッドには入りません。

ここで何か間違っていますか?

+0

*「誰かがここで何か間違っていると思われますか?」*はい、このようなノイズです。*「ありがとうございました。」 Fer *今後はお控えください。 –

+0

* "configurationChangesメソッドには決して入らない" *どのような 'configurationChanges'メソッド?もっと早く助けを求めるには、[SSCCE](http://sscce.org/)を投稿してください。 –

+0

@AndrewThompsonでは、configurationChangesメソッドはコード内にあります。コード全体がConfigurationManagerクラス用であり、その内部にはconfigurationChangedメソッドが宣言されています(オーバーライドされています)。それは見えませんか? –

答えて

1

私はこのテストをして分析した後、configurationChangedを呼び出すために、設定から値を取得するために明示的に呼び出しを行う必要があります。 それは私がやっていなかったことです。

私がそれをしたときに問題は解決しました。

0

ConfigurationListenerを設定した後、makeUpdates()に電話しています。

さらに、load()を呼び出すことは、イベントが発生することを保証するものではありません。

最後に、この拡張クラスに対して実際にaddProperty()などを呼び出しているものはありますか?

0

小さな問題(resource bundles)がキャッシュされている場合は、clearCacheを呼び出すことはできますが、残念ながらバンドル単位ではなくクラスローダーごとに呼び出すことができます。

関連する問題