相关文章推荐
热情的煎鸡蛋  ·  全国法院优秀案例分析光荣榜:全国法院系统20 ...·  6 月前    · 
飞奔的绿茶  ·  《夏多罗》海棠作者合集丨直播时人设崩了/穿成 ...·  1 年前    · 
粗眉毛的青蛙  ·  中国亚马逊的海外购商品真假度值得信任吗? - 知乎·  1 年前    · 
忐忑的眼镜  ·  加盟全家便利店怎么样? - 知乎·  1 年前    · 
笑点低的西红柿  ·  命中注定我爱你(2008年陈铭章导演的电视剧 ...·  1 年前    · 
Code  ›  Java 项目中一种简单的动态修改配置即时生效的方式 WatchService开发者社区
https://cloud.tencent.com/developer/article/1156958
坏坏的蚂蚁
6 月前
古时的风筝

Java 项目中一种简单的动态修改配置即时生效的方式 WatchService

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
古时的风筝
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > Java 项目中一种简单的动态修改配置即时生效的方式 WatchService

Java 项目中一种简单的动态修改配置即时生效的方式 WatchService

作者头像
古时的风筝
发布 于 2018-07-05 11:44:55
2.3K 0
发布 于 2018-07-05 11:44:55
举报
文章被收录于专栏: 古时的风筝

这种方式仅适合于比较小的项目,例如只有一两台服务器,而且配置文件是可以直接修改的。例如 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 目录。

代码语言: javascript
复制
@Repository
public 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) {
 
推荐文章
热情的煎鸡蛋  ·  全国法院优秀案例分析光荣榜:全国法院系统2017年度优秀案例分析获奖名单 - 中国应用法学网
6 月前
飞奔的绿茶  ·  《夏多罗》海棠作者合集丨直播时人设崩了/穿成了死对头的c气娃娃该怎么办/缚青 - 哔哩哔哩
1 年前
粗眉毛的青蛙  ·  中国亚马逊的海外购商品真假度值得信任吗? - 知乎
1 年前
忐忑的眼镜  ·  加盟全家便利店怎么样? - 知乎
1 年前
笑点低的西红柿  ·  命中注定我爱你(2008年陈铭章导演的电视剧)_百度百科
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号