亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java動態修改配置即時生效的方式WatchService

2024-07-14 08:41:20
字體:
來源:轉載
供稿:網友

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

原始方式

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

假設我們用 spring mvc 開發,開發完成后打成 war 包部署到 tomcat 上,如果這時我們修改一個短信接口地址。

我們要做如下操作:

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

2、編譯打包;

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

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

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

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

WatchService 方式

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

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

先上代碼吧,這是在一個 spring mvc 項目里,監控的是 resources 目錄。

@Repositorypublic class ConfigWatcher {  private static final Logger logger = LoggerFactory.getLogger(ConfigWatcher.class);  private static WatchService watchService;  @PostConstruct  public void init() {    logger.info("啟動配置文件監控器");    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();    }    /**     * 啟動監控線程     */    Thread watchThread = new Thread(new WatchThread());    watchThread.setDaemon(true);    watchThread.start();    /**注冊關閉鉤子*/    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 {          // 嘗試獲取監控池的變化,如果沒有則一直等待          WatchKey watchKey = watchService.take();          for (WatchEvent<?> event : watchKey.pollEvents()) {            String editFileName = event.context().toString();            logger.info(editFileName);            /**             * 重新加載配置             */          }          watchKey.reset();//完成一次監控就需要重置監控器一次        } catch (Exception e) {          e.printStackTrace();        }      }    }  }}

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

1、StandardWatchEventKinds#OVERFLOW

2、StandardWatchEventKinds#ENTRY_CREATE

3、StandardWatchEventKinds#ENTRY_DELETE

4、StandardWatchEventKinds#ENTRY_MODIFY

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

最后,還要注冊一個 hook,在 jvm 關閉的時候可以關閉監控器。

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

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

配置中心的方式

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

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

各位同學可以根據需要自行選擇,更詳細的內容可以自行搜索和實踐。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲欧美日韩在线不卡| 精品福利一区二区| 亚洲美女在线观看| 曰本色欧美视频在线| 最近2019中文字幕在线高清| 精品女同一区二区三区在线播放| 欧美专区日韩视频| 亚洲人成网站色ww在线| 欧美日韩免费在线观看| 91精品久久久久久久久不口人| 色香阁99久久精品久久久| 欧美综合激情网| 成人精品一区二区三区电影免费| 亚洲精品短视频| 欧美日韩亚洲激情| 久久夜精品va视频免费观看| 91av免费观看91av精品在线| 亚洲二区在线播放视频| 日韩视频亚洲视频| 亚洲高清久久久久久| 欧美激情视频一区| 亚洲最大成人在线| 国产亚洲欧美日韩一区二区| 亚洲女人被黑人巨大进入al| 久久久久久久97| 国产精品国产三级国产专播精品人| 日韩精品视频在线观看网址| 日韩在线资源网| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产日韩欧美在线图片| 亚洲日本中文字幕免费在线不卡| 亚洲国产精品久久久久秋霞蜜臀| 国产亚洲成av人片在线观看桃| 性色av一区二区三区红粉影视| 91在线免费视频| 国产在线观看不卡| 欧美自拍视频在线| 日韩中文字幕亚洲| 欧美亚洲国产日本| 国产精品激情av电影在线观看| 最新国产成人av网站网址麻豆| 欧美与黑人午夜性猛交久久久| 日韩欧美综合在线视频| 午夜精品一区二区三区在线视频| 一本一本久久a久久精品牛牛影视| 91精品久久久久久久久久久久久| 欧美三级免费观看| 欧美成人免费全部观看天天性色| 91中文字幕在线| 久久久最新网址| 国产一区二区三区网站| 伊人伊成久久人综合网小说| 欧美区二区三区| 久久影院在线观看| 欧美一级黄色网| 欧美电影在线观看完整版| 欧美大片第1页| 欧美日韩国产综合新一区| 不卡av在线播放| 狠狠色狠色综合曰曰| 亚洲精品一区二区三区婷婷月| 国产精品久久久久久久午夜| 91九色蝌蚪国产| 国产精品专区一| 欧美激情一区二区三区久久久| 欧美日韩精品在线观看| 96国产粉嫩美女| 欧美精品videosex牲欧美| 成人精品久久av网站| 精品视频在线导航| 日本欧美一二三区| 97不卡在线视频| 成人黄色短视频在线观看| 久久亚洲精品一区二区| 亚洲性生活视频在线观看| 国产不卡av在线免费观看| 精品香蕉一区二区三区| 欧美成人自拍视频| 国产精品视频不卡| 亚洲欧美中文日韩在线| 久久九九有精品国产23| 成人美女免费网站视频| 久久亚洲精品国产亚洲老地址| 欧美激情中文字幕在线| 中文字幕国产亚洲| 国产伦精品一区二区三区精品视频| 国产精品wwwwww| 成人免费福利在线| 国产精品丝袜久久久久久不卡| 久久久999精品免费| 日韩精品视频观看| 久久久久一本一区二区青青蜜月| 久久精品视频网站| 久久精品亚洲一区| 久久久久久久久久国产精品| 久久精品成人欧美大片| 国产不卡av在线免费观看| 国内精品久久久久久影视8| 国产精品久久久久国产a级| 欧美电影在线观看高清| 欧美性生活大片免费观看网址| 国产欧美精品日韩| 2019中文在线观看| 亚洲欧美国内爽妇网| 最近更新的2019中文字幕| 国产九九精品视频| 国产欧美精品一区二区三区介绍| 国产热re99久久6国产精品| 中日韩美女免费视频网站在线观看| 久久久精品久久久久| 精品成人乱色一区二区| 欧美日韩在线第一页| 欧美日韩在线视频一区| 亚洲午夜国产成人av电影男同| 日韩毛片在线观看| 久久国产精品影片| 精品美女久久久久久免费| 国产精品美女久久久久av超清| 亚洲深夜福利在线| 亚洲精美色品网站| 欧美午夜宅男影院在线观看| 国产日韩中文字幕在线| 国产欧美va欧美va香蕉在| 国产成人福利夜色影视| 在线播放国产一区中文字幕剧情欧美| 久久国产加勒比精品无码| 亚洲天堂成人在线视频| 亚洲韩国欧洲国产日产av| 亚洲自拍偷拍视频| 欧美电影在线播放| 亚洲r级在线观看| 国产成+人+综合+亚洲欧洲| 日韩在线观看免费全| 精品久久香蕉国产线看观看gif| 精品国产老师黑色丝袜高跟鞋| 欧美大尺度电影在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品免费观看在线| 亚洲国产高清高潮精品美女| 日韩风俗一区 二区| 啪一啪鲁一鲁2019在线视频| 国产91精品久久久| 国产成人午夜视频网址| 在线观看国产欧美| 亚洲毛茸茸少妇高潮呻吟| 亚洲欧美国产精品久久久久久久| 亚洲国产精品一区二区三区| 97精品国产97久久久久久免费| 国产精品久久久久久久久免费看| 在线激情影院一区| 色爱精品视频一区| 欧美激情影音先锋| 在线视频欧美日韩| 欧美在线观看网站| 91免费的视频在线播放| 精品国产91乱高清在线观看| 午夜精品蜜臀一区二区三区免费| 欧美在线不卡区| 久久免费视频在线| 亚洲精品日韩在线| 中文字幕欧美亚洲| 国产精品成av人在线视午夜片| 国产免费一区二区三区香蕉精| 在线丨暗呦小u女国产精品|