0

我们的产品目前使用 JDK 1.6,因此我们必须依赖 JNotify 来进行文件系统更改。然而,在测试过程中,我注意到在我的 Win 7 开发环境中运行完美的东西在 XP 和 win server 2003 中停止运行。所以我继续编写了一个小型测试程序。这是它大致的样子。

在主要课程中,我只有这个:

public static void main(String[] args) {
    SyncUtil instance = new SyncUtil();
    instance.start();

    Scanner s = new Scanner(System.in);
    s.nextLine();
}

SyncUtil 是一个扩展 Threads 的类:

    public void run() {
        String path = "D:\\testFolder";
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        boolean watchSubtree = true;
        File file = null;
        try {
            JNotify.addWatch(path, mask, watchSubtree, new Listener());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Listener 类内部没有任何工作,它只是打印日志。现在,如果我在 Windows 7 / 8 上运行上述示例。它会工作得很好。但是当我在我的 Win Server 2003 上测试它时,JNotify 只是停止工作,Listener 根本不会打印任何日志。

更有趣的是,如果我尝试让 SyncUtil 在其工作后等待一分钟。如果我添加:

Thread.sleep(60000);

到 run 函数结束,使其等待 60 秒。而不是监视 1 文件夹,这次我将监视 2,我将它们称为文件夹 A 和 B。

在这种情况下,在 Win Server 2003 机器上发生的情况是,如果我在 60 秒的等待时间内将文件添加到文件夹 A,JNotify 将正确响应事件并打印日志。即使 60s 已经过去并且 SyncUtil 线程被终止,它甚至会继续工作。但是现在我在文件夹 B 中添加了一个文件(在 60 秒的等待时间之后),什么都不会打印。

综上所述,症状是: 1、在win 7和win 8上,JNotify会继续工作,不管调用JNotify.addWatch()的线程是否还活着。2、在win XP和win server 2003上,当线程调用JNotify.addWatch()运行时,JNotify可以正常产生事件。在该线程仍处于活动状态时至少生成一个事件的路径将在该线程终止后继续受到监视。但是那些在所述线程处于活动状态时未生成任何事件的路径,在该线程终止后将无法工作。

现在知道了这种模式,我目前正在使用 CountDownLatch 来解决这个问题,但我真的很好奇为什么会发生这种情况。我觉得这种说法没有任何意义,你认为问题出在哪里?我倾向于得出这样的结论,即 Windows 可能以不同的方式触发文件系统事件?你认为可能是这种情况吗?

4

1 回答 1

0

这很奇怪,但是:添加手表是一个非常快速的操作,为什么要在线程中添加它们?

于 2013-09-07T03:29:18.140 回答