posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          用java寫服務(wù)程序時(shí)經(jīng)常會(huì)涉及到監(jiān)控某些配置文件,當(dāng)配置文件發(fā)生變化時(shí)實(shí)時(shí)重新加載該文件的內(nèi)容到內(nèi)存.
          實(shí)際上log4j里有現(xiàn)成的類FileWatchdog做了類似的工作.我們只需繼承它,然后重寫它的一些方法就可以了.
           
             /**使用log4j的監(jiān)控狗 */
              
          public class IPAccessFileWatchdog extends FileWatchdog {
                  
          public IPAccessFileWatchdog(String filename){
                      
          super(filename);
                  }


                  
          public void doOnChange() {
                      List
          <String> list = IPAccessController.this.loadIPRule(new File(this.filename));
                      
          if (list != null{
                          IPAccessController.
          this.ipRule = list.toArray(new String[list.size()]);
                      }
           else {
                          IPAccessController.
          this.ipRule = null;
                      }

                      LogLog.warn(
          "ip access config load completed from file:" + filename);
                  }

              }

          }


          FileWatchdog的代碼也很簡單,其實(shí)就是起一個(gè)線程,每隔固定的時(shí)間掃描一次監(jiān)控的文件.我把代碼也貼出來:'


          // Contributors:  Mathias Bogaert

          package org.apache.log4j.helpers;

          import java.io.File;
          import org.apache.log4j.helpers.LogLog;

          public abstract class FileWatchdog extends Thread {

            
            
          static final public long DEFAULT_DELAY = 60000
            
            
          protected String filename;
            
            
            
          protected long delay = DEFAULT_DELAY; 
            
            File file;
            
          long lastModif = 0
            
          boolean warnedAlready = false;
            
          boolean interrupted = false;

            
          protected
            FileWatchdog(String filename) 
          {
             
          this.filename = filename;
             file 
          = new File(filename);
             setDaemon(
          true);
             checkAndConfigure();
            }


            
            
          public
            
          void setDelay(long delay) {
             
          this.delay = delay;
            }


            
          abstract 
            
          protected 
            
          void doOnChange();

            
          protected
            
          void checkAndConfigure() {
             
          boolean fileExists;
             
          try {
              fileExists 
          = file.exists();
             }
           catch(SecurityException  e) {
              LogLog.warn(
          "Was not allowed to read check file existance, file:["+
           filename
          +"].");
              interrupted 
          = true// there is no point in continuing
              return;
             }


             
          if(fileExists) {
              
          long l = file.lastModified(); // this can also throw a SecurityException
              if(l > lastModif) {      // however, if we reached this point this
          lastModif = l;        // is very unlikely.
          doOnChange();
          warnedAlready 
          = false;
              }

             }
           else {
              
          if(!warnedAlready) {
          LogLog.debug(
          "["+filename+"] does not exist.");
          warnedAlready 
          = true;
              }

             }

            }


            
          public
            
          void run() {   
             
          while(!interrupted) {
              
          try {
            Thread.sleep(delay);
              }
           catch(InterruptedException e) {
          // no interruption expected
              }

              checkAndConfigure();
             }

            }

          }



          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 肥西县| 武宣县| 白山市| 阿荣旗| 哈尔滨市| 翁牛特旗| 桐梓县| 南投县| 嵊泗县| 霍城县| 南京市| 云浮市| 宣汉县| 云龙县| 公主岭市| 肥城市| 洛宁县| 涪陵区| 舞阳县| 通海县| 陆丰市| 奉新县| 西丰县| 澎湖县| 云梦县| 宝丰县| 陇西县| 泸州市| 东丽区| 岗巴县| 射阳县| 尉犁县| 长汀县| 延安市| 庆安县| 哈尔滨市| 松潘县| 页游| 阿拉善盟| 凤凰县| 庄浪县|