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

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线