Java 7 WatchService - 忽略同一事件的多次出现

2023-12-23

javadoc 为StandardWatchEventKinds.ENTRY_MODIFY says:

目录条目已修改。当为此注册目录时 事件,然后当观察到其中的条目时,WatchKey 将排队 该目录已被修改。该事件的事件计数为 1 或更大。

当您通过编辑器编辑文件的内容时,它将修改日期(或其他元数据)和内容。因此你得到两个ENTRY_MODIFY事件,但每个都会有一个count1(至少这是我所看到的)。

我正在尝试监视配置文件(servers.cfg之前已注册WatchService)手动更新(即通过命令行vi)使用以下代码:

while(true) {
    watchKey = watchService.take(); // blocks

    for (WatchEvent<?> event : watchKey.pollEvents()) {
        WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
        WatchEvent.Kind<Path> kind = watchEvent.kind();

        System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
        // prints (loop on the while twice)
        // servers.cfg, count: 1, event: ENTRY_MODIFY
        // servers.cfg, count: 1, event: ENTRY_MODIFY

        switch(kind.name()) {
            case "ENTRY_MODIFY":
                handleModify(watchEvent.context()); // reload configuration class
                break;
            case "ENTRY_DELETE":
                handleDelete(watchEvent.context()); // do something else
                break;              
        }
    }   

    watchKey.reset();       
}

既然你得到了两个ENTRY_MODIFY事件时,上面的代码会在只需要一次时重新加载配置两次。假设可能存在多个此类事件,是否有任何方法可以忽略除其中一个之外的所有事件?

If the WatchServiceAPI 有这样的实用性就更好了。 (我有点不想检查每个事件之间的时间。我的代码中的所有处理程序方法都是同步的。

如果您从一个目录创建(复制/粘贴)文件到监视目录,也会发生同样的情况。如何将这两者结合到一个活动中?


WatcherServices 报告事件两次,因为基础文件更新了两次。一次用于内容,一次用于文件修改时间。这些事件发生在很短的时间内。要解决这个问题,请在两间卧室之间睡觉poll() or take()电话和key.pollEvents()称呼。例如:

@Override
@SuppressWarnings( "SleepWhileInLoop" )
public void run() {
  setListening( true );

  while( isListening() ) {
    try {
      final WatchKey key = getWatchService().take();
      final Path path = get( key );

      // Prevent receiving two separate ENTRY_MODIFY events: file modified
      // and timestamp updated. Instead, receive one ENTRY_MODIFY event
      // with two counts.
      Thread.sleep( 50 );

      for( final WatchEvent<?> event : key.pollEvents() ) {
        final Path changed = path.resolve( (Path)event.context() );

        if( event.kind() == ENTRY_MODIFY && isListening( changed ) ) {
          System.out.println( "Changed: " + changed );
        }
      }

      if( !key.reset() ) {
        ignore( path );
      }
    } catch( IOException | InterruptedException ex ) {
      // Stop eavesdropping.
      setListening( false );
    }
  }
}

Calling sleep()有助于消除双重调用。延迟可能必须高达三秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 7 WatchService - 忽略同一事件的多次出现 的相关文章

随机推荐

  • 如何获取从 sstream 变量中提取字符串后剩余的字符串?

    就像我有一个stringstream变量包含 abc gg rrr ff 当我使用 gt gt 在那stringstream变量 它给了我 abc 我怎样才能得到剩余的字符串 gg rrr ff 看来两者都不是str nor rdbuf 这
  • ”?' aria-label='如何修复“无法从方法组转换为 'Func”?'> 如何修复“无法从方法组转换为 'Func”?

    try var login ToServiceLogin lgParameters await Task Factory FromAsync loginOperation BeginLogin loginOperation EndLogin
  • 带有自定义图像的活动指示器

    I am loading a UIWebView and in the meantime I wan t to show a blank page with this activity indicator spinning siri act
  • 使用纯 JavaScript 获取元素的尺寸和位置[重复]

    这个问题在这里已经有答案了 情况 我想获取元素的尺寸和位置 Context 我正在制作一款纸牌游戏 卡片可以放置在板上 我需要能够检查他们的目的地是否在板上 然后我将存储它们相对于板的尺寸和位置的位置 这将有助于在可能使用不同屏幕尺寸的一群
  • 如何限制 Python 线程?

    我有一个线程执行大量 CPU 密集型处理 这似乎阻塞了其他线程 我该如何限制它 这是专门针对 web2py 的 但通用的解决方案就可以了 事实上 我不久前刚刚开始研究这个问题 你将无法更改线程优先级 但有一些方法可以解决这个问题 为了给您提
  • Google App Engine 中的 Memcache 1 MB 限制

    如何在 memcache 中存储大小大于 1 MB 的对象 有没有办法将其拆分 但仍然可以使用相同的密钥访问数据 我使用以下模块 blobcache 在 GAE 的内存缓存中存储大小大于 1Mb 的值 import pickle impor
  • 格式化目录中的所有 XML 文件并将它们保存在子目录中

    我正在尝试编写一个脚本来查看目录 找到所有 XML 文件 然后运行它们xmllint 并将格式化结果保存到名为的子目录中的同名文件中formatted 这是我到目前为止的脚本 find maxdepth 1 type f iname xml
  • Python:-mno -cygwin

    我正在尝试在 Windows 上学习大量 Python 其中包括安装多个软件包 但是每次我调用 python setup py install 时 我都会遇到 gcc 的 mno cygwin 问题 我已经阅读了很多文章 似乎他们希望这些单
  • R:取消列出为两列数据框(名称,值)

    我想从命名列表创建两列data frame 列表名称出现在第一列中 列表元素出现在第二列中 我设法做到了这一点 这完成了工作 但远非优雅 my list lt list one digit 0 9 two digits 10 29 thre
  • Netbeans 7.0 中的 SVN 1.7+

    我有一个使用totoiseSVN 的项目 在升级到 1 7 版本之前 一切正常 但是当我将 tortoiseSVN 升级到 1 7 版本时 当我尝试提交或显示历史日志或更新时 它会给我一个错误 org tigris subversion j
  • 使用 CAEmitterLayer 围绕圆或 CGPath 绘制粒子

    我正在尝试使用 iOS 5 的粒子系统 CAEmitterLayer 和 CAEmitterCell 围绕圆 或者更好的是 CGPath 绘制粒子 但我不知道该怎么做 我能做的最好的事情就是制作一个圆弧 通过修改 CAEmitterCell
  • MySQL 错误 1205:超出锁定等待超时

    我正在使用 SQLyog 将生产数据库同步到开发数据库 在 4 张桌子上 我得到 Error No 1205 Lock wait timeout exceeded try restarting transaction 研究网络似乎表明事务已
  • 获取 IntentService 中的地理定位上下文

    我正在创建一个 Android 类库 它调用内部 REST API 并且还利用需要 Context 的 Android 地理编码器类 特别是 getFromLocation 我计划将库设为 IntentService 以允许其异步运行 但我
  • Android - 获取当前时间而不依赖于设备时钟

    我注意到 System currentTimeMillis 时间取决于设备 如果我更改设备时钟上的时间 此方法将返回不同的答案 例如 如果现在的实时时间是 10 00 并且我将设备上的时钟更改为 9 30 则 System currentT
  • 如何在 dart/flutter 中继承静态方法?

    Dart Flutter 是否可以继承静态方法或工厂 或者我是否需要通过创建一个实例来访问该静态方法来解决这个问题 我的情况是 我想序列化一个对象 但需要访问它们的通用解析函数 abstract class Foo static Foo p
  • Android:带有毫秒的计时器?

    我想要的是以毫秒为单位测量时间 但是使用Chronometer有一个问题 它没有精度 它的最高分辨率是秒 我见过这个 使用 Android Chronometer 显示毫秒 https stackoverflow com questions
  • 将 IList> 转换为 List> 形式

    在以下代码中 response Values 返回 IList gt IList
  • 无法列出 *v1alpha1.Order:orders.certmanager.k8s.io 被禁止

    几个月前 我配置了自动 SSL 证书管理 如下所述 http docs cert manager io en latest tutorials acme dns validation html http docs cert manager
  • Ansible 中基于路径的参数的流程替换

    许多 Ansible 模块被设计为接受文件路径作为参数 但无法直接提供文件内容 如果输入数据实际上来自文件以外的其他内容 这会强制人们在磁盘上的某个位置创建一个临时文件 将预期的参数值写入其中 然后将该临时文件的路径提供给 Ansible
  • Java 7 WatchService - 忽略同一事件的多次出现

    javadoc 为StandardWatchEventKinds ENTRY MODIFY says 目录条目已修改 当为此注册目录时 事件 然后当观察到其中的条目时 WatchKey 将排队 该目录已被修改 该事件的事件计数为 1 或更大