精品国产亚洲一区二区三区,男女作爱在线观看免费网站,欧美的又大又长做禁片A片,97国产精品人妻无码久久久

  • 相關(guān)軟件
    >避免重啟你的應(yīng)用程序 一 創(chuàng)建者:webmaster 更新時(shí)間:2005-05-16 21:55

    轉(zhuǎn)自:javaresearch.org

    在開(kāi)發(fā)測(cè)試階段,某個(gè)功能模塊出錯(cuò)或者功能需求改變,這時(shí)候程序員通常會(huì)修改源代碼,然后重新編譯,停止應(yīng)用程序,重起應(yīng)用程序。然后檢測(cè)修改得功能是否正確,是否滿足需求。很好,這一切在開(kāi)發(fā)測(cè)試階段都沒(méi)有問(wèn)題,無(wú)可厚非。不過(guò)到了應(yīng)用正式上線就出現(xiàn)麻煩了。重啟應(yīng)用會(huì)導(dǎo)致系統(tǒng)不可用,或者導(dǎo)致用戶請(qǐng)求、響應(yīng)丟失。甚至有的系統(tǒng)本生就要求為系統(tǒng)動(dòng)態(tài)添加功能,在沒(méi)有為你的應(yīng)用添加防止重啟動(dòng)的策略前,通常能做的是到凌晨2點(diǎn)趁用戶少的時(shí)候重啟你的應(yīng)用或者是暫時(shí)切換到備份系統(tǒng)。
    如果你的系統(tǒng)也遇到過(guò)或者將不可避免的遇到這樣的問(wèn)題,那在這篇文章里,幾個(gè)解決辦法可以供你選擇使用。
    一:在啟動(dòng)前,保存未被處理的請(qǐng)求和未發(fā)給用戶的響應(yīng)。較好的方式是將接收請(qǐng)求,發(fā)送響應(yīng)的模塊與你處理應(yīng)用邏輯的模塊分開(kāi)設(shè)計(jì)。如現(xiàn)在的web服務(wù)器,可以在你重新部署(redploy)的時(shí)候暫把用戶的請(qǐng)求保存到隊(duì)列,等到部署成功后在提交給處理邏輯的模塊。又如,接收請(qǐng)求,發(fā)送響應(yīng)的模塊是不同的應(yīng)用。與應(yīng)用邏輯模塊之間通過(guò)文件(把請(qǐng)求序列化成一個(gè)文件)等方式交換數(shù)據(jù),這樣在你的邏輯應(yīng)用重啟后,仍然可以繼續(xù)讀取請(qǐng)求
    二:如果更新的功能是純數(shù)據(jù)的,那么,采用動(dòng)態(tài)配置,避免重啟動(dòng)。比如,一個(gè)web系統(tǒng),提供reloadConfig界面,重新從配置文件里讀取數(shù)據(jù)。一個(gè)java應(yīng)用程序,你可以在你的應(yīng)用程序里啟動(dòng)一個(gè)檢測(cè)線程,檢測(cè)文件是否被改變,如果改變,則自動(dòng)重新轉(zhuǎn)載配置。如下例子:
    public ConfigChecker extends Thread
    {
        SystemManager sm = null;
        long time ;
        public ConfigChecker(SystemManager sm) throws ApplicationException
        {
          this.sm = sm;
          time = getConfigFileTime();
        }
        pulblic void run()
        {
         
          while(!interrupted())
          {
                try
            {
                long newTime = getConfigFileTime();
                if(newTime!=time)
                {
                  time = newTime;
                  //重新裝載配置
                  sm.reloadConfig();
               
                }
                Thread.sleep(1000*3)
            }
            catch(Exception ex)
            {
                return ;
            }
               
          }
        }
       
        public long getConfigFileTime() throws ApplicationException
        {
          try
          {
            File f = new File(sm.getConfigFile());
            return f.lastModified()
          }
          catch(IOException ex)
          {
            throw new ApplicationException(ex.getMessage())
          }
         
        }
    }


    這種方式適合你要?jiǎng)討B(tài)改變的是純數(shù)據(jù),它要求你應(yīng)用中的數(shù)據(jù)不能寫(xiě)死在代碼里,而是通過(guò)文件配置。通過(guò)重新從配置文件里讀取數(shù)據(jù)避免重啟動(dòng)

    三:如果更新的功能包括應(yīng)用邏輯,也就是class改變了,那就稍微麻煩點(diǎn),你需要了解ClassLoader的原理。使用你定制的ClassLoader重新Load 已經(jīng)編譯好的class,就好比你重啟應(yīng)用一樣。下面將簡(jiǎn)單介紹ClassLoader原理,以及舉出一個(gè)例子來(lái)說(shuō)明如何避免重啟應(yīng)用程序
    在開(kāi)發(fā)測(cè)試階段,某個(gè)功能模塊出錯(cuò)或者功能需求改變,這時(shí)候程序員通常會(huì)修改源代碼,然后重新編譯,停止應(yīng)用程序,重起應(yīng)用程序。然后檢測(cè)修改得功能是否正確,是否滿足需求。很好,這一切在開(kāi)發(fā)測(cè)試階段都沒(méi)有問(wèn)題,無(wú)可厚非。不過(guò)到了應(yīng)用正式上線就出現(xiàn)麻煩了。重啟應(yīng)用會(huì)導(dǎo)致系統(tǒng)不可用,或者導(dǎo)致用戶請(qǐng)求、響應(yīng)丟失。甚至有的系統(tǒng)本生就要求為系統(tǒng)動(dòng)態(tài)添加功能,在沒(méi)有為你的應(yīng)用添加防止重啟動(dòng)的策略前,通常能做的是到凌晨2點(diǎn)趁用戶少的時(shí)候重啟你的應(yīng)用或者是暫時(shí)切換到備份系統(tǒng)。
    如果你的系統(tǒng)也遇到過(guò)或者將不可避免的遇到這樣的問(wèn)題,那在這篇文章里,幾個(gè)解決辦法可以供你選擇使用。
    一:在啟動(dòng)前,保存未被處理的請(qǐng)求和未發(fā)給用戶的響應(yīng)。較好的方式是將接收請(qǐng)求,發(fā)送響應(yīng)的模塊與你處理應(yīng)用邏輯的模塊分開(kāi)設(shè)計(jì)。如現(xiàn)在的web服務(wù)器,可以在你重新部署(redploy)的時(shí)候暫把用戶的請(qǐng)求保存到隊(duì)列,等到部署成功后在提交給處理邏輯的模塊。又如,接收請(qǐng)求,發(fā)送響應(yīng)的模塊是不同的應(yīng)用。與應(yīng)用邏輯模塊之間通過(guò)文件(把請(qǐng)求序列化成一個(gè)文件)等方式交換數(shù)據(jù),這樣在你的邏輯應(yīng)用重啟后,仍然可以繼續(xù)讀取請(qǐng)求
    二:如果更新的功能是純數(shù)據(jù)的,那么,采用動(dòng)態(tài)配置,避免重啟動(dòng)。比如,一個(gè)web系統(tǒng),提供reloadConfig界面,重新從配置文件里讀取數(shù)據(jù)。一個(gè)java應(yīng)用程序,你可以在你的應(yīng)用程序里啟動(dòng)一個(gè)檢測(cè)線程,檢測(cè)文件是否被改變,如果改變,則自動(dòng)重新轉(zhuǎn)載配置。如下例子:
    public ConfigChecker extends Thread
    {
        SystemManager sm = null;
        long time ;
        public ConfigChecker(SystemManager sm) throws ApplicationException
        {
          this.sm = sm;
          time = getConfigFileTime();
        }
        pulblic void run()
        {
         
          while(!interrupted())
          {
                try
            {
                long newTime = getConfigFileTime();
                if(newTime!=time)
                {
                  time = newTime;
                  //重新裝載配置
                  sm.reloadConfig();
               
                }
                Thread.sleep(1000*3)
            }
            catch(Exception ex)
            {
                return ;
            }
               
          }
        }
       
        public long getConfigFileTime() throws ApplicationException
        {
          try
          {
            File f = new File(sm.getConfigFile());
            return f.lastModified()
          }
          catch(IOException ex)
          {
            throw new ApplicationException(ex.getMessage())
          }
         
        }
    }


    這種方式適合你要?jiǎng)討B(tài)改變的是純數(shù)據(jù),它要求你應(yīng)用中的數(shù)據(jù)不能寫(xiě)死在代碼里,而是通過(guò)文件配置。通過(guò)重新從配置文件里讀取數(shù)據(jù)避免重啟動(dòng)

    三:如果更新的功能包括應(yīng)用邏輯,也就是class改變了,那就稍微麻煩點(diǎn),你需要了解ClassLoader的原理。使用你定制的ClassLoader重新Load 已經(jīng)編譯好的class,就好比你重啟應(yīng)用一樣。下面將簡(jiǎn)單介紹ClassLoader原理,以及舉出一個(gè)例子來(lái)說(shuō)明如何避免重啟應(yīng)用程序
    相關(guān)文章
    本頁(yè)查看次數(shù):