我在Spring Boot应用程序中使用Java的WatchService
API来监控目录,并对创建的文件执行一些操作。它在应用程序准备就绪后立即自动启动,并在后台监视目录,直到应用程序停止。
这是配置类:
@Configuration
public class DirectoryWatcherConfig {
@Value("${path}")
private String path;
@Bean
public WatchService watchService() throws IOException {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path directoryPath = Paths.get(path);
directoryPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
return watchService;
}
}
这是监控服务:
@Service
@RequiredArgsConstructor
public class DirectoryWatcherService {
private final WatchService watchService;
@Async
@EventListener(ApplicationReadyEvent.class)
public void startWatching() throws InterruptedException {
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
// actions on created files
}
key.reset();
}
}
}
这段代码按预期工作,但有以下例外,我希望修复:
- 执行过程中的任何故障都会使监控停止(很明显),并且我不知道如何在此类事件发生后重新启动监控
1条答案
按热度按时间pxy2qtax1#
您应该使用更改循环,并在重新启动服务的捕获中添加try/Catch。正如您所评论的,即使被中断也需要保留,因此您将需要使用ExecutorService。在方法外声明Executor
在这个方法里面类似于我上一个答案但是使用了执行器