基于触发器java运行任务

时间:2014-02-04 07:56:38

标签: java multithreading java-ee

如果在Java中存在触发器(即某些事件,如新文件添加到目录),我想运行任务。 Java是否内置了对此的支持? 如果没有,我可以用什么第三方图书馆来促进这个?

3 个答案:

答案 0 :(得分:1)

在Java 7中,Watch Service允许在文件或目录上检测到更改或事件时执行任务。

教程:http://docs.oracle.com/javase/tutorial/essential/io/notification.html#overview

API文档:http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html

这是我做过的一个简单示例:

package watcher;

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Watcher {

    private final FileCreatedAction action;
    private final String pathToWatchString;

    public Watcher(FileCreatedAction action, String pathToWatchString) {
        this.action = action;
        this.pathToWatchString = pathToWatchString;
    }

    public void start() throws IOException {
        FileSystem defaultFileSystem = FileSystems.getDefault();
        WatchService watchService = defaultFileSystem.newWatchService();
        Path pathToWatch = defaultFileSystem.getPath(pathToWatchString);
        pathToWatch.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
        while(true) {
            try {
                WatchKey key = watchService.take();
                if (key != null) {
                    for (WatchEvent<?> event: key.pollEvents()) {
                        if (event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE))
                        {
                            WatchEvent<Path> ev = (WatchEvent<Path>)event;
                            Path filename = ev.context();
                            Path fullFilename = pathToWatch.resolve(filename);
                            action.performAction(fullFilename);
                        }
                    }
                }
            } catch (InterruptedException error) {
                return;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        FileCreatedAction action = new FileCreatedAction() {

            @Override
            public void performAction(Path fullPath) {
                System.out.printf("Found file %s", fullPath);
            }
        };

        Watcher watcher = new Watcher(action, "/foo");
        watcher.start();
    }

}

interface FileCreatedAction {
    void performAction(Path fullPath);
}

答案 1 :(得分:0)

您可以轻松实现自己的文件系统跟踪器。 这里有一个很好的工作示例:

How to watch the file system for changes in Java 7 (JDK 7)

答案 2 :(得分:0)

通常,您需要的是名为“Observer Pattern”的设计模式。您可以实现自己的,无需任何内置支持或外部框架。

对于内置支持,请检查Java的'util'包中的“观察者”和 EventListener (自Java 7开始)接口。

另外,请检查以下链接:

1)Generic, annotation-driven event notification frameworks

2)Alternative to Java's Observable class?