初学Java Watch Spring AOP只执行一次

时间:2018-03-26 11:43:13

标签: java spring aop watchservice

我正在开发一个独立的Java Spring应用程序并使用Spring的标准AOP实现。

我正在使用Java WatchService观察传入文件的FTP文件夹,并且使用AOP,我想记录FTP中出现的每个文件。

问题是它适用于第一个文件,但不适用于进入FTP文件夹的后续文件。

监视FTP文件夹的部分如下:

public void monitor() {
    while (key.isValid()) {
        for (WatchEvent<?> event : key.pollEvents()) {
            if (event.kind() == ENTRY_CREATE)
                downloadService.addToDownloading(event);
            else if (event.kind() == ENTRY_DELETE)
                downloadService.removeFromDownloading(event);
            preprocessorService.stageFiles();
            preprocessorService.processStaged();
            //if 10am file has been detected or it's past 12 then do real processing.
            //create a copy of the collections and clear the ones used for downloading.
            downloadService.printCollections();
        }
        key.reset();
    }
}

所以基本上我想在每次执行“downloadService.addToDownloading(event)”时打印到控制台。

所以我定义了以下切入点表达式:

@Pointcut("execution(* <packageName>.services.DownloadService.addToDownloading(..)) " + "&& args(file)")
public void pointcutTest(Path file) {}

以下使用了Pointcut表达式:

 @Before("pointcutTest(file)")
 public void test(Path file) {
    System.out.println("File: \n\t" + file.getFileName() + "\nhas appeared in the FTP\n");
}

当FTP文件夹中的第一个文件出现并且它打印到控制台但没有为进入FTP的后续文件执行时,这种方法有效。

这是预期的行为吗?每次文件出现在FTP中时,如何执行“测试”方法?

谢谢。

1 个答案:

答案 0 :(得分:0)

你好@Nikolay舍甫琴科是对的。我有两个重载方法:一个采用Path,另一个采用Event。更改切入点以期望WatchEvent正常工作,现在正在按预期工作。谢谢尼古拉。