国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java動(dòng)態(tài)修改配置即時(shí)生效的方式WatchService

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

2021-05-10 11:27風(fēng)的姿態(tài) Java教程

這篇文章給大家分享了Java動(dòng)態(tài)修改配置即時(shí)生效的方式WatchService的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。

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

原始方式

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

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

我們要做如下操作:

1、打開(kāi)配置文件,修改配置信息;

2、編譯打包;

3、停止 tomcat ,刪除舊的項(xiàng)目目錄;

4、將新的 war 包放到 webapps ,啟動(dòng) tomcat。

當(dāng)然,可以直接在 tomcat 中找到這個(gè)項(xiàng)目的配置文件,然后修改,但同樣需要重啟 tomcat 。

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

WatchService 方式

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
@Repository
public class ConfigWatcher {
 
  private static final Logger logger = LoggerFactory.getLogger(ConfigWatcher.class);
 
  private static WatchService watchService;
 
  @PostConstruct
  public void init() {
    logger.info("啟動(dòng)配置文件監(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();
    }
 
    /**
     * 啟動(dòng)監(jiān)控線程
     */
    Thread watchThread = new Thread(new WatchThread());
    watchThread.setDaemon(true);
    watchThread.start();
 
    /**注冊(cè)關(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)控池的變化,如果沒(méi)有則一直等待
          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();
        }
      }
    }
  }
}

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

1、StandardWatchEventKinds#OVERFLOW

2、StandardWatchEventKinds#ENTRY_CREATE

3、StandardWatchEventKinds#ENTRY_DELETE

4、StandardWatchEventKinds#ENTRY_MODIFY

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

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

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

本文主要介紹的是這種方式,上面也說(shuō)了,這種方式只適合非常簡(jiǎn)單的項(xiàng)目,對(duì)于大型項(xiàng)目,就需要用到更高級(jí)的方式了。

配置中心的方式

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

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

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

原文鏈接:https://www.cnblogs.com/fengzheng/p/9212155.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品久久精品 | 久久久久久一区 | 欧美一区二区三区久久 | 91精品国产九九九久久久亚洲 | 在线观看特色大片免费网站 | 国产伦精品一区二区三区四区视频 | 中文字幕av一区二区三区 | 日韩精品一区二区三区四区五区 | 色交视频| 91在线精品一区二区 | 国产精品久久久久久亚洲调教 | 91看视频| 日韩精品无码一区二区三区 | 国产精品视频导航 | 午夜影院在线观看 | 欧美精品1 | 狠狠操夜夜爱 | 日日夜夜狠狠干 | 四虎永久在线观看 | 免费特级黄毛片 | 中文字幕亚洲欧美日韩在线不卡 | 国产在线a | 91精品国产欧美一区二区 | 毛片在线视频 | 99亚洲| 91精选视频在线观看 | 日韩精品中文字幕在线 | 福利成人 | 影音先锋中文字幕在线观看 | 91精品国产综合久久福利软件 | 日韩资源 | 偷拍一区二区三区四区 | 黄色国产片 | 色橹橹欧美在线观看视频高清 | 久久久91精品国产一区二区三区 | 亚洲精品一二三 | a国产精品 | 一区二区日韩 | 欧洲亚洲精品久久久久 | 日韩在线视频观看 | 亚洲婷婷综合网 |