网站内容更新不及时(常用的解决方式常见的常见方法介绍)
优采云 发布时间: 2021-10-25 10:07网站内容更新不及时(常用的解决方式常见的常见方法介绍)
场景
在很多需要多次读取配置文件的地方,希望修改文件后尽快读取新的配置。
常见解决方案
常见的解决方案是使用轮换训练。就是启动一个线程来定期训练配置文件的最后修改时间。如果修改时间与上次不同,则重新读取配置文件的内容。
上面的方法很浪费资源,因为你的cpu要不停的轮换和判断,如果固定的时间间隔过长,会造成信息修改不及时的问题。
新功能说明
java7新增了目录监控功能,解决了上述问题。这个版本提供了一个 WatchService。这个类的作用是注册文件夹和对应的事件。常见的事件是创建、删除和更改。当相应的事件发生时,您可以获取事件发生所在的文件或文件夹,从而实现对更改的及时访问。这带来了好处。当你想关注配置文件的变化时,在文件所在的文件夹中注册相应的事件。通常,注册更改事件。
写作方式
所有文件注入都是相似的。所有这些编程都是标准化的。
首先获取WatchService对象
WatchService watcher = FileSystems.getDefault().newWatchService();
我们监控的是文件夹,文件系统的所有WatchService
然后我们需要得到我们要注册事件的文件夹dir,是Path类型,然后在服务上注册事件。在这里我们注册一个更改事件。
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) 这里的第一个参数是文件,第二个参数是对应的事件。通过上面的操作,我们可以只关心我们的业务流程,不用写很繁琐的操作。