java 出现异常后重新启动WatchService

guykilcj  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(218)
    • bounty将在6天后过期**。回答此问题可获得+50声望奖励。thmasker希望引起更多人关注此问题。

我在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();
        }
    }

}

这段代码按预期工作,但有以下例外,我希望修复:

  • 执行过程中的任何故障都会使监控停止(很明显),并且我不知道如何在此类事件发生后重新启动监控
pxy2qtax

pxy2qtax1#

您应该使用更改循环,并在重新启动服务的捕获中添加try/Catch。正如您所评论的,即使被中断也需要保留,因此您将需要使用ExecutorService。在方法外声明Executor

@Autowired
private ExecutorService executor;

在这个方法里面类似于我上一个答案但是使用了执行器

Runnable task = () -> {
        while (true) {
            try {
                WatchKey key = watchService.take();
                if (key != null) {
                    for (WatchEvent<?> event : key.pollEvents()) {
                        // Perform actions on created files here
                    }
                    key.reset();
                }
            } catch (Exception e) {
                // Wait for some time before starting the thread again
                Thread.sleep(5000);
            }
        }
    };
    //submit the task to the executor
    executor.submit(task);

相关问题