欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學堂java培訓簡述Java動態(tài)修改配置即時生效的方式WatchService

2018-06-26 10:22:01 1439瀏覽

  這種方式僅適合于比較小的項目,例如只有一兩臺服務(wù)器,而且配置文件是可以直接修改的。例如Springmvc以war包的形式部署,可以直接修改resources中的配置文件。如果是Springboot項目,還想用這種方式的話,就要引用一個外部可以編輯的文件,比如一個固定的目錄,因為springboot大多數(shù)以jar包部署,打到包里的配置文件沒辦法直接修改。如果是比較大的項目,最好還是用配置中心,例如攜程的Apollo、Consul等。





原始方式

原始方式指的是每次要修改配置的時候,都要重新打包發(fā)布或者重啟服務(wù)器。

假設(shè)我們用springmvc開發(fā),開發(fā)完成后打成war包部署到tomcat上,如果這時我們修改一個短信接口地址。

我們要做如下操作:

1、打開配置文件,修改配置信息;

2、編譯打包;

3、停止tomcat,刪除舊的項目目錄;

4、將新的war包放到webapps,啟動tomcat。

當然,可以直接在tomcat中找到這個項目的配置文件,然后修改,但同樣需要重啟tomcat。

如果只是單純做開發(fā)或者測試,除了有點浪費時間外,當然可以接受。那么,既不想浪費時間又不想重啟tomcat呢,有沒有辦法呢。這就輪到本文介紹的這種方式了。

WatchService方式

Java提供了WatchService接口,這個接口是利用操作系統(tǒng)本身的文件監(jiān)控器對目錄和文件進行監(jiān)控,當被監(jiān)控對象發(fā)生變化時,會有信號通知,從而可以高效的發(fā)現(xiàn)變化。

這種方式大致的原理:先根據(jù)操作系統(tǒng)new一個監(jiān)控器(WatchService),然后選擇要監(jiān)控的配置文件所在目錄或文件,然后訂閱要監(jiān)控的事件,例如創(chuàng)建、刪除、編輯,最后向被監(jiān)控位置注冊這個監(jiān)控器。一旦觸發(fā)對應(yīng)我們所訂閱的事件時,執(zhí)行相應(yīng)的邏輯即可。

先上代碼吧,這是在一個springmvc項目里,監(jiān)控的是resources目錄。



@Repository
public class ConfigWatcher {
 
  private static final Logger logger = LoggerFactory.getLogger(ConfigWatcher.class);
 
  private static WatchService watchService;
 
  @PostConstruct
  public void init() {
    logger.info("啟動配置文件監(jiān)控器");
    try {
      watchService = FileSystems.getDefault().newWatchService();
      URL url = ConfigWatcher.class.getResource("/");
      Path path = Paths.get(url.toURI());
      path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
    } catch (Exception e1) {
      e1.printStackTrace();
    }
 
    /**
     * 啟動監(jiān)控線程
     */
    Thread watchThread = new Thread(new WatchThread());
    watchThread.setDaemon(true);
    watchThread.start();
 
    /**注冊關(guān)閉鉤子*/
    Thread hook = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          watchService.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    });
    Runtime.getRuntime().addShutdownHook(hook);
  }
 
  public class WatchThread implements Runnable {
    @Override
    public void run() {
      while (true) {
        try {
          // 嘗試獲取監(jiān)控池的變化,如果沒有則一直等待
          WatchKey watchKey = watchService.take();
          for (WatchEvent<?> event : watchKey.pollEvents()) {
            String editFileName = event.context().toString();
            logger.info(editFileName);
            /**
             * 重新加載配置
             */
          }
          watchKey.reset();//完成一次監(jiān)控就需要重置監(jiān)控器一次
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  }
}



代碼非常簡單,一看就懂,在項目啟動的時候,用FileSystems.getDefault().newWatchService()創(chuàng)建一個WatchService,這是根據(jù)操作系統(tǒng)來的。然后獲取resources目錄的URL,并由此獲取Path,然后調(diào)用Path對象的register方法,注冊監(jiān)控器,訂閱了編輯和創(chuàng)建事件。事件在StandardWatchEventKinds類中定義,共有四種:

1、StandardWatchEventKinds#OVERFLOW

2、StandardWatchEventKinds#ENTRY_CREATE

3、StandardWatchEventKinds#ENTRY_DELETE

4、StandardWatchEventKinds#ENTRY_MODIFY

然后單獨啟動了一個WatchThread線程來處理變化邏輯,在一個while無限循環(huán)中調(diào)用take()方法,直到有變化發(fā)生,一旦是我們監(jiān)控的配置文件發(fā)生了變化,則調(diào)用我們的邏輯重新加載配置。另外,每次有變化發(fā)生后,要調(diào)用watchKey.reset()方法來重置監(jiān)控器。

最后,還要注冊一個hook,在jvm關(guān)閉的時候可以關(guān)閉監(jiān)控器。

有了這種方式,當我們有一些配置變化的時候,就可以直接到tomcat下修改配置文件,不用重啟就可以生效了。

本文主要介紹的是這種方式,上面也說了,這種方式只適合非常簡單的項目,對于大型項目,就需要用到更高級的方式了。

配置中心的方式

當項目復(fù)雜度變高,配置修改后實時生效,灰度發(fā)布,分環(huán)境、分集群管理配置,完善的權(quán)限、審核機制可能都變成項目中要考慮的問題,這個時候,單純依賴配置文件就顯得力不從心了。

目前比較用的比較多的配置中心有etcd、zookeeper、disconf、Apollo等。disconf、Apollo都是屬于拿來即用的,功能完善,而且有配套的UI。而etcd和zookeeper需要一些定制開發(fā)。

以上就是Java動態(tài)修改配置即時生效的方式WatchService的方式各位同學可以根據(jù)需要自行選擇,更詳細的內(nèi)容請登錄扣丁學堂官網(wǎng),或關(guān)注微信公眾號進行了解,更有大量java在線視頻教程等你來觀看?。?br />



扣丁學堂微信公眾號

【關(guān)注微信公眾號獲取更多學習資料】




查看更多關(guān)于“Java開發(fā)資訊的相關(guān)文章>>

標簽: java java培訓 java在線視頻教程

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部