网站内容更新不及时(常用的解决方式常见的常见方法介绍)

优采云 发布时间: 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) 这里第一个参数是文件,第二个参数是对应的事件。通过上面的操作,我们可以只关心我们的业务流程,不用写很复杂的操作。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线