Java 7 NIO watchservice vs jpathwatch



我正在做的项目一直在使用Java 6和jpathwatch(.95(,现在正在升级到Java 7。目前在 Windows 7 和 2008 服务器上。我正在重构代码区域以使用新的Java 7 NIO,并且相对简单 - 甚至使用NIO.2来取代jpathwatch。但是,我们代码的文件监视区域开始失败单元测试。Java 7 NIO 似乎不会接受其他机器的 UNC 路径更改 -

\otherMachpathtowatch.  

为了进行测试,我实现了Java NIO教程站点 http://docs.oracle.com/javase/tutorial/essential/io/fileio.html 的代码,然后在jpathwwatch导入而不是Java NIO导入中创建了一个重复的类交换。 jpathwatch适用于UNC路径,但Java NIO不适用于。它似乎注册甚至返回该位置的初始事件键:(示例输出(

INFO: Watching: \otherMachpathtowatch
DEBUG: Added: \otherMachpathtowatch
INFO: Got event key: sun.nio.fs.WindowsWatchService$WindowsWatchKey@1f26ecd2
INFO: event key for: \otherMachpathtowatch

但随后从未认识到任何进一步的变化。

jpathwatch 注册并报告目录和文件事件(尽管它不会在注册后立即报告初始事件(。

INFO: Watching: \otherMachpathtowatch
DEBUG: Added: \otherMachpathtowatch
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \otherMachpathtowatch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \otherMachpathtowatchNew folder
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \otherMachpathtowatch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \otherMachpathtowatchNew Text Document.txt

尽管在 jpathwatch 讨论中看到不支持网络观看 - 注意 Uwe Pachler 引用 UNC 路径的响应 - http://sourceforge.net/p/jpathwatch/discussion/888207/thread/8ea778de/?limit=25#0037

有没有人有幸观看UNC路径和Java 7 NIO.2?还有其他或更新的解决方案吗?

谢谢

-姆贾什

看起来这是JDK中的一个错误,该错误已在JDK 1.7.0_u60中修复。我刚刚尝试了 u71(一直在使用 u45(并验证它现在对我跨 UNC 有效。

如果您使用的是 WatchEvent 上的 Oracle 文档中的教程和示例,则在处理事件后可能会错过调用 key.reset((。我刚刚遇到了同样的问题:

    void processEvent(){
    for(;;){
        WatchKey key;           
        try {
            key = this.watcher.take();
        } catch (InterruptedException ex){
            return;
        }
        for(WatchEvent<?> event: key.pollEvents()){
            WatchEvent<Path> newevent = (WatchEvent<Path>)event;
            Path filepath = newevent.context();
        ... clipped ....
        }
        boolean valid = key.reset();
        if(!valid){
            break;
        }
    }
虽然没有

关于 UNC 路径和远程文件系统的明确描述,但这是我发现的:

起初,似乎

可以注册监视键,但监视键立即失效(WatchKey.isValid()(。

由于与文件系统的直接连接,因此无法将监视密钥注册到远程位置。

可能的解决方法:

1. 远程文件观察器

共享要监视的路径列表到远程 jvm,并让它将更改转发到您的计算机。

2. 轮询

另一种解决方法是轮询器(只有在时间紧迫的情况下才可推荐(。
如果您不断轮询,这将导致大量网络流量。

最好在

注册到远程路径时获得异常,或者至少在When to Use and Not Use This API部分中阅读该异常。

相关内容

  • 没有找到相关文章

最新更新