我正在开发一个独立的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中时,如何执行“测试”方法?
谢谢。
答案 0 :(得分:0)
你好@Nikolay舍甫琴科是对的。我有两个重载方法:一个采用Path,另一个采用Event。更改切入点以期望WatchEvent正常工作,现在正在按预期工作。谢谢尼古拉。