网站内容更新不及时(常用的解决方式常见的常见方法介绍)
优采云 发布时间: 2022-03-06 13:04网站内容更新不及时(常用的解决方式常见的常见方法介绍)
场景
在很多需要多次读取配置文件的地方,希望在修改文件后尽快读取新的配置。
常见解决方案
常见的解决方案一般是使用轮换训练。就是开一个线程周期性的训练配置文件的最后修改时间。如果修改时间与上次不同,则重新读取配置文件的内容。
上面的方法是浪费资源,因为你的CPU要不断的轮换判断,如果固定的时间间隔过长,会造成信息修改不及时的问题。
新功能说明
java7中新增了一个特性,目录监控,解决了上述问题。这个版本提供了一个 WatchService。这个类的作用是注册文件夹和对应的事件。常见事件是创建、删除和更改。当相应的事件发生时,您可以获取事件发生的文件或文件夹,以便及时获取更改。这带来了一个优势。当要关注配置文件的变化时,可以在文件所在的文件夹上注册相应的事件,一般是注册变化事件。
怎么写
所有文件注入都是相似的。所有这些编程都是规范的事情。
首先获取WatchService对象
WatchService watcher = FileSystems.getDefault().newWatchService();
我们监控的是文件夹,现在文件系统的所有WatchServices
然后我们需要获取我们要注册事件的文件夹dir,它是一个Path类型,然后在服务上注册事件,这里我们只是注册一个change事件。
dir.register(watcher, ENTRY_MODIFY);
然后就是通过事件*敏*感*词*来获取变化的情况。WatchService可以使用take或者poll的方式轮流训练,take是阻塞的,poll是非阻塞的,这个根据具体场景选择,下面选择take,可以节省部分cpu消耗。
WatchKey key = watcher.take();
通过这个方法可以获得一个watchkey,它的pollEvents方法会返回所有对应的事件。我们选择使用for循环来遍历。
for (WatchEvent event : key.pollEvents())
也可以根据这个key获取被监控的目录
Path dir = (Path) key.watchable();
根据事件强制转换为Path,根据context方法可以得到一个路径。
然后根据path方法,就可以得到修改后文件的完整路径。
Path child = dir.resolve(name);
优化书写方式
由于上面的编码其实是比较规范的,所以我将这些函数直接抽象封装起来。并分享
怎么还需要上面的模式,只要简化成下面几行代码
final DirWatcher dw = new DirWatcher(true);
dw.registerAllEvents(Paths.get("c:/hello")).addHandler(new WatcherResultHandler() {
public void handleResult(Path path, Kind event) {
System.out.println(path.toString() + ": " + event.toString());
}
}).processEvents();
精简后,我们只需要进入被监控的目录,然后实现一个WatcherResultHandler接口即可完成回调。
handleResult(Path path, Kind event) 这里第一个参数是文件,第二个参数是对应的事件。通过上面的操作,我们可以只关心我们的业务流程,不用写很复杂的操作。