如何中止 Spring-Boot 启动?

2022-09-04 03:08:38

我正在编写一个Spring-Boot应用程序来监视目录并处理要添加到其中的文件。我在配置类中向 WatchService 注册该目录:

@Configuration
public class WatchServiceConfig {

    private static final Logger logger = LogManager.getLogger(WatchServiceConfig.class);

    @Value("${dirPath}")
    private String dirPath;

    @Bean
    public WatchService register() {
        WatchService watchService = null;

        try {
            watchService = FileSystems.getDefault().newWatchService();
            Paths.get(dirPath).register(watchService, ENTRY_CREATE);
            logger.info("Started watching \"{}\" directory ", dlsDirPath);
        } catch (IOException e) {
            logger.error("Failed to create WatchService for directory \"" + dirPath + "\"", e);
        }

        return watchService;
    }
}

如果注册目录失败,我想优雅地中止Spring Boot启动。有人知道我该怎么做吗?


答案 1

获取应用程序上下文,例如:

@Autowired
private ConfigurableApplicationContext ctx;

如果找不到该目录,请调用该方法:close

ctx.close();

这会正常关闭应用程序上下文,从而关闭 Spring Boot 应用程序本身。

更新

基于问题中提供的代码的更详细的示例。

主类

@SpringBootApplication
public class GracefulShutdownApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(GracefulShutdownApplication.class, args);
        try{
            ctx.getBean("watchService");
        }catch(NoSuchBeanDefinitionException e){
            System.out.println("No folder to watch...Shutting Down");
            ctx.close();
        }
    }

}

监视服务配置

@Configuration
public class WatchServiceConfig {

    @Value("${dirPath}")
    private String dirPath;

    @Conditional(FolderCondition.class)
    @Bean
    public WatchService watchService() throws IOException {
        WatchService watchService = null;
        watchService = FileSystems.getDefault().newWatchService();
        Paths.get(dirPath).register(watchService, ENTRY_CREATE);
        System.out.println("Started watching directory");
        return watchService;
    }

文件夹条件

public class FolderCondition implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String folderPath = conditionContext.getEnvironment().getProperty("dirPath");
        File folder = new File(folderPath);
        return folder.exists();
    }
}

根据目录是否存在来生成监视服务 Bean。然后在主类中,检查 WatchService Bean 是否存在,如果没有,则通过调用 来关闭应用程序上下文。@Conditionalclose()


答案 2

接受的答案是正确的,但不必要的复杂。不需要 ,然后检查 Bean 是否存在,然后关闭 .只需在创建期间检查目录是否存在,并引发异常,就会由于无法创建 Bean 而中止应用程序启动。ConditionApplicationContextWatchService


推荐