我有SpringBoot应用程序,该应用程序加载了一些配置并以@PostConstract注释的方法运行了长时间的处理。如果应用程序成功完成或出现错误,应释放一些资源。

问题是如何最正确地释放应用程序资源?是否足以在@PreDestroy带注释的方法中实现它,或者我也应该在@PostConstract带注释的方法中捕获异常。

@SpringBootApplication
@Import(MyConfiguration.class)
public class MySpringApplication {

    @Autowire
    ProcessRunner processRunner;

    @Autowire
    ResourceBean resourceBean;

    public static void main(String[] args) {
        SpringApplication.run(MySpringApplication.class, args);
    }

    @PostConstruct
    void postConstruct {
        try {
            processRunner.run()
        } catch (Exception ex) {
            // Do we really need this Exception handling to release resource?
            resourceBean.release();
        }
    }

    @PreDestroy
    void preDestroy() {
        resourceBean.release();
    }
}

最佳答案

预销毁
当上下文释放bean时用作回调(即:在上下文关闭时)。这意味着PreDestroy不与PostConstruct耦合。如果Bean存在于上下文中并被释放,则将调用predestroy。

后构造
旨在初始化bean。如果引发异常,则应用程序将无法启动。

所以,回答您的问题...


如果在事后合同中出现异常,是否可以授予predestroy-method-call?


PreDestroy和PostConstruct不耦合。这意味着,如果PostConstruct遇到异常但以某种方式进行了管理并且该方法成功结束,则将初始化Bean,并在上下文中将其可用。当时间到了并且上下文关闭时,将释放Bean并调用PreDestroy。

如果PostConstruct抛出异常,则Bean将在上下文中不可用(并且该应用程序将无法启动),因此不会调用PreDestroy。


问题是如何最正确地释放应用程序资源?这足以在@PreDestroy带注释的方法中使它生效,还是我也应该在@PostConstract带注释的方法中捕获异常?


您应该捕获异常并释放所有非托管资源。这也适用于JEE,JEE指定作为最佳实践,必须以编程方式处理在上下文之外获取的资源。

09-10 08:46