麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

Java動態(tài)修改配置即時生效的方式WatchService

2024-07-14 08:41:20
字體:
供稿:網(wǎng)友

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

原始方式

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

假設我們用 spring mvc 開發(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ā)對應我們所訂閱的事件時,執(zhí)行相應的邏輯即可。

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

@Repositorypublic 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();    /**注冊關閉鉤子*/    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 關閉的時候可以關閉監(jiān)控器。

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

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

配置中心的方式

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

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

各位同學可以根據(jù)需要自行選擇,更詳細的內(nèi)容可以自行搜索和實踐。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美中文字幕一区二区三区亚洲 | 国产三级国产精品国产普男人 | 精精国产xxxx视频在线播放7 | 久久久久亚洲视频 | 国产91精品久久久久久久 | xxxxhdvideosex| 91懂色| 国产91极品 | 久久免费观看一级毛片 | 久久精品亚洲欧美日韩精品中文字幕 | 成人免费一区 | 国产91精品一区二区麻豆亚洲 | 日韩欧美激情视频 | 宅男噜噜噜66一区二区 | 久久一区三区 | 91精品国| 色综合久久久久久 | 91美女福利视频 | 黄视频免费在线 | 成人三级黄色片 | 午夜精品久久久久久中宇 | 久久久一区二区三区精品 | 国产又白又嫩又紧又爽18p | 亚洲免费视 | 国产精品免费久久久久久 | 毛片免费在线 | 日本在线播放一区二区 | 久久久国产电影 | 精品中文一区 | 91成人久久 | 深夜福利视频绿巨人视频在线观看 | 毛片一区二区三区四区 | 精品国产一区二区在线 | 国产又白又嫩又紧又爽18p | 国产精品爱久久久久久久 | 黄色免费影片 | 日本高清在线免费 | 国产免费专区 | 欧美成人自拍 | 成人在线观看一区 | 日本一区免费看 |