当前位置: 首页 > 面试题库 >

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

松雅健
2023-03-14
问题内容

的javadoc StandardWatchEventKinds.ENTRY_MODIFY说:

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

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

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

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事件,因此上述步骤将在仅需要一次时重新加载配置两次。假设可能发生不止一种这样的事件,是否有任何方法可以忽略其中的一种?

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

如果将文件从一个目录创建(复制/粘贴)到监视目录,则会发生相同的情况。您如何将两者结合成一个事件?


问题答案:

我有一个类似的问题-我正在使用WatchService
API来保持目录同步,但是观察到在许多情况下,更新执行了两次。我似乎已经通过检查文件上的时间戳解决了该问题-
这似乎屏蔽了第二个复制操作。(至少在Windows 7中-我不确定它是否可以在其他操作系统中正常工作)

也许您可以使用类似的东西?从文件存储时间戳并仅在更新时间戳时重新加载吗?



 类似资料:
  • 显示: 目录条目已修改。当为此事件注册目录时,当观察到目录中的条目已被修改时,WatchKey将排队。此事件的事件计数为1或更大。 通过编辑器编辑文件内容时,它会同时修改日期(或其他元数据)和内容。因此,您将获得两个事件,但每个事件的值为1(至少我看到的是这样)。 我试图监视配置文件(以前注册的),手动更新(即通过命令行)以下代码: 由于您会得到两个事件,因此当只需要一次时,上述事件将重新加载配置

  • 我有一个 Blob 存储容器,其中配置了事件网格触发器(Blob 已创建)。我正在通过数据工厂加载此 blob 存储文件,很多时候,许多文件可能会在一次尝试中出现在此 blob 中。也许我们可以举一个20个文件的例子。 好消息是我的事件网格触发器启动了,函数app被调用。然而,我发现有时对于同一个文件,事件网格触发器被触发了不止一次。 在这20个文件中,很少有文件非常大,比如300 MB,但其他文

  • 我有两层(=锚烷),一层叠在另一层上,有一个堆叠窗格。所以这两层都填满了整个场景。问题是,只有顶层接收鼠标事件。 这就是场景的构建方式: 只有按钮B接收点击事件,但按钮A不接收。 如果我将层B设置为鼠标透明(),按钮A将接收鼠标事件。但是鼠标的透明效果也会影响所有的孩子,所以按钮B不再接收鼠标事件。 如何让按钮A和按钮B接收鼠标事件? 以下是完整的工作来源:

  • 我是Flink CEP的新手,一直在玩弄这些模式,以便更好地理解它们。我有一个简单的“开始”的例子 Pattern match\u win=模式。开始(“第一”)。其中(new SimpleCondition(){ 我正在通过4,4,6 并行度设置为1。 StreamExecutionEnvironment env=StreamExecutionEnvironment。getExecutionEn

  • 我的Python Azure函数配置文件()定义了一个Blob存储触发器。 当Azure功能唤醒时(即,Live Metrics中显示的服务器在一段睡眠时间后变为在线),它将处理所有现有Blob,而不管哪些Blob已经生成触发事件。 我注意到< code > azure-web jobs-hosts/blob receipts 文件夹中填充了< code>sandboxhost637nnn文件夹。

  • 问题内容: 我正在尝试在Python中多次读取某些文件的行。 我正在使用这种基本方式: 一切正常,但是如果我想在文件仍处于打开状态的情况下每行第二次进行迭代,例如: 然后它不起作用,我需要打开,然后关闭,然后再次打开我的文件以使其正常工作。 感谢您的回答! 问题答案: 使用file.seek()跳到文件中的特定位置。但是,请考虑是否真的有必要再次浏览该文件。也许有更好的选择。