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メソッドに入ることはありません。

誰かがここで何か間違っているのを見ますか?

4

3 に答える 3

1

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

私がそれをしたとき、物事は修正されました。

于 2012-04-20T14:50:12.403 に答える
0

makeUpdates()を設定した後に呼び出していますConfigurationListener

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

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

于 2012-04-18T17:57:29.877 に答える
0

副次的な問題:リソース バンドルはキャッシュされますclearCache。残念ながら、バンドルごとではなく、クラス ローダーごとに を呼び出すことができます。

于 2012-04-18T18:08:35.713 に答える