2015-04-22 76 views
5

我遇到WatchService问题。这里是我的代码片段:WatchService:错过和未处理的事件

public void watch(){ 
    //define a folder root 
    Path myDir = Paths.get(rootDir+"InputFiles/"+dirName+"/request");  

    try { 
    WatchService watcher = myDir.getFileSystem().newWatchService(); 
    myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); 

    WatchKey watckKey = watcher.take(); 

    List<WatchEvent<?>> events = watckKey.pollEvents(); 
    for (WatchEvent event : events) { 
     //stuff 
    } 
    }catch(Exception e){} 

    watckKey.reset(); 

} 

*首先,要知道手表()被调用的无限循环中。

问题是,当一次创建多个文件时,某些事件丢失。例如,如果我将三个文件复制粘贴到“.../request”文件夹中,则只有一个文件被捕获,其他文件保持不变,没有OVERFLOW事件触发。在一些不同的计算机和操作系统中,它最多可以达到两个文件,但如果其中一个尝试3个或更多,其余的仍然未被触及。

虽然我找到了解决办法,但我认为这不是最佳做法。这是流量:

的过程开始,然后停止在

WatchKey watckKey = watcher.take(); 

如预期,(按照Processing events)。然后,我将3个文件放在“请求”文件夹中,因此,过程恢复在

List<WatchEvent<?>> events = watckKey.pollEvents(); 

问题在这里。看起来线程在这条线上的速度非常快,以致两个创建的事件保持落后并丢失,只有一个被采用。解决方法是添加一个额外的行权上面这一块,像这样:

Thread.sleep(1000); 
List<WatchEvent<?>> events = watckKey.pollEvents(); 

这似乎是一个解决办法,至少要等三,数人同时文件,但它是不可扩展的。 所以最后,我想知道这个问题是否有更好的解决方案。仅供参考,我正在运行Win 7 64

非常感谢!

回答

1

如果手表被称为无限循环中,那么你创建监视服务无限没有时间,因此失去了事件的可能性,我会建议做到以下几点,打电话给你的方法watchservice一次:

public void watchservice() 
{ 
    Thread fileWatcher = new Thread(() -> 
    { 
     Path path = Paths.get(rootDir+"InputFiles/"+dirName+"/request"); 
     Path dataDir = Paths.get(path);  

     try 
     { 
      WatchService watcher = dataDir.getFileSystem().newWatchService(); 
      dataDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); 

      while (true) 
      { 
       WatchKey watckKey; 
       try 
       { 
        watckKey = watcher.take(); 
       } 
       catch (Exception e) 
       { 
        logger.error("watchService interupted:", e); 
        return; 
       } 
       List<WatchEvent<?>> events = watckKey.pollEvents(); 
       for (WatchEvent<?> event : events) 
       { 
        logger.debug("Event Type : "+ event.kind() +" , File name found :" + event.context()); 
        if (event.kind() != StandardWatchEventKinds.OVERFLOW) 
        { 
         // do your stuff 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      logger.error("Error: " , e); 
     } 
    }); 
    fileWatcher.setName("File-Watcher"); 
    fileWatcher.start(); 

    fileWatcher.setUncaughtExceptionHandler((Thread t, Throwable throwable) -> 
    { 
     logger.error("Error ocurred in Thread " + t, throwable); 
    }); 
} 
+0

在一些点我的编码我做到了这一点,我把腕表服务的创作摆脱了无限循环。我不记得确切的原因,也没有再次尝试这种情况。解决方法仍然存在 – McCoy