我正在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();
}
}
}
这段代码按预期工作,但存在以下异常情况,我希望解决它:
- 执行过程中的任何失败都会导致监控停止(显然),而我不知道如何在此类事件发生后重新启动监控
watchService
已关闭,而是在执行此方法期间发生任何异常都会使线程停止(请注意,此过程是异步执行的)。我需要的是每次执行被中断时都异步重新启动此过程。 - thmasker