简介
WatchService是jdk7之后nio包中的新功能。可以看作是文件监控器,通过操作系统原生文件系统来运行。 针对单点多appkey的情况,可以注册开启多个监控器。 每个监控器可看作是后台线程,通过监控文件发出的信号来实现监控。
应用场景
1、感知系统配置文件的变化,修改配置文件内容即时生效,无需重启服务器2、监控磁盘中的文件变化
用watchservice修改配置文件方式仅适合于比较小的项目,例如只有一两台服务器,而且配置文件是可以直接修改的。例如 Spring mvc 以 war 包的形式部署,可以直接修改resources 中的配置文件。如果是 Spring boot 项目,还想用这种方式的话,就要引用一个外部可以编辑的文件,比如一个固定的目录,因为 spring boot 大多数以 jar 包部署,打到包里的配置文件没办法直接修改。如果是比较大的项目,最好还是用配置中心,例如携程的 Apollo、Consul 等。
动态修改配置即时生效实现方法
1、WatchService 实例化
2、使用 Path 来指定要监控的目录
3、将 Path 注册到 WatchService
使用Path.register() 方法注册要监控指定目录的那些事件(创建、修改、删除)
StandardWatchEventKinds.ENTRYCREATE //创建StandardWatchEventKinds.ENTRYMODIFY //修改StandardWatchEventKinds.ENTRY_DELETE //删除
4、创建监听配置文件守护线程
使用WatchService监听配置文件所在目录内容的变化,包括修改、删除事件。通过后台线程实现阻塞等待内容变化事件,一旦发现有变更,则重新装载配置文件
核心代码块:
5、注册关闭钩子,当JVM停止时关闭WatchService。
验证动态修改配置是否生效测试
1、测试代码
application.properties
初始内容username=helloworld
不停服务,将username修改为test,观察控制台打印value的值是否动态生效
通过控制台可以说明,value已经动态修改,说明配置文件即时被加载
demo地址
https://github.com/lyb-geek/first-watchserver
领取专属 10元无门槛券
私享最新 技术干货