观察者模式适合文件监控吗?

Dan*_*lia 3 java algorithm design-patterns

我很想知道观察者模式是否是实现代码以监视日志文件及其更改的正确方法?

我目前正在使用它,但似乎有一个我无法解释的异常情况。基本上,我创建了一个名为 FileMonitor 的类,它有一个触发的计时器,它迭代一个唯一文件列表,以寻找更改的“上次修改日期”。

找到后,将遍历 Listeners 列表以查找匹配的文件,并通知它的 fileChanged 事件。然后它开始处理添加到文件中的行。

所以为了让我的问题更简洁:

  1. 观察者模式是否适合我想要做的事情?(目前我每个文件有一个监听器)
  2. 鉴于要监控的文件不止一个,是否有可能出现“并发问题”?

谢谢

Sub*_*der 5

Java 7 引入了WatchService哪些监视已注册对象的更改和事件。

Watchable 对象通过调用其 register 方法向监视服务注册,返回一个 WatchKey 来表示注册。当检测到某个对象的事件时,该键被发出信号,如果当前没有发出信号,则它会排队等待观察服务,以便调用轮询或采取方法来检索键和处理事件的消费者可以检索它。一旦事件被处理,消费者调用键的重置方法来重置键,这允许键被发送信号并与进一步的事件重新排队。

文件系统报告事件的速度可能比检索或处理它们的速度快,并且实现可能对其可能累积的事件数量施加未指定的限制。如果实现有意丢弃事件,则它会安排键的 pollEvents 方法返回事件类型为 OVERFLOW 的元素。消费者可以使用此事件作为重新检查对象状态的触发器。

例子 -

Path myDir = Paths.get("D:/test");       

    try {
       WatchService watcher = myDir.getFileSystem().newWatchService();
       myDir.register(watcher, StandardWatchEventKind.ENTRY_CREATE, 
       StandardWatchEventKind.ENTRY_DELETE, StandardWatchEventKind.ENTRY_MODIFY);

       WatchKey watckKey = watcher.take();

       List<WatchEvent<?>> events = watckKey.pollEvents();
       for (WatchEvent event : events) {
            if (event.kind() == StandardWatchEventKind.ENTRY_CREATE) {
                System.out.println("Created: " + event.context().toString());
            }
            if (event.kind() == StandardWatchEventKind.ENTRY_DELETE) {
                System.out.println("Delete: " + event.context().toString());
            }
            if (event.kind() == StandardWatchEventKind.ENTRY_MODIFY) {
                System.out.println("Modify: " + event.context().toString());
            }
        }

    } catch (Exception e) {
        System.out.println("Error: " + e.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

参考 -链接