如果我们在@PostConstract 中得到异常,是否授予@PreDestroy 方法调用
Is @PreDestroy method call granted if we get an Exception in @PostConstract
我有 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存在于context中并且被释放,predestroy会被调用。
构造后
用于初始化 bean。如果抛出异常,应用程序将不会启动。
所以,回答你的问题...
is predestroy-method-call granted if we get an exception in postconstract?
PreDestroy 和 PostConstruct 没有耦合。这意味着,如果 PostConstruct 出现异常但以某种方式得到管理并且该方法成功结束,则该 bean 将被初始化并且它将在上下文中可用。当时间到了并且上下文关闭时,bean 将被释放并调用 PreDestroy。
如果 PostConstruct 抛出异常,则 Bean 在上下文中不可用(并且应用程序不会启动),因此不会调用 PreDestroy。
The question is how to make the most correct release of application resources? Is that enough to make it in @PreDestroy annotated method or I should also catch the exception in @PostConstract annotated method?
您应该捕获异常并释放任何非托管资源。这也适用于 JEE,它指定作为最佳实践,必须以编程方式处理在上下文之外获取的资源。
详情@PostConstruct
and @PreDestroy
annotations allow you to define lifecycle callbacks for your beans (see the documentation。
如果@PostConstruct
注解的方法可能会抛出异常,你应该捕获它们并相应地处理资源的释放。考虑以下示例:
@SpringBootApplication
public class MySpringApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
@PostConstruct
public void init() {
System.out.println("@PostConstruct method executed");
throw new RuntimeException();
}
@PreDestroy
public void destroy() {
System.out.println("@PreDestroy method executed");
}
}
在这种情况下,@PreDestroy
注解的方法不会被执行。
我有 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存在于context中并且被释放,predestroy会被调用。
构造后 用于初始化 bean。如果抛出异常,应用程序将不会启动。
所以,回答你的问题...
is predestroy-method-call granted if we get an exception in postconstract?
PreDestroy 和 PostConstruct 没有耦合。这意味着,如果 PostConstruct 出现异常但以某种方式得到管理并且该方法成功结束,则该 bean 将被初始化并且它将在上下文中可用。当时间到了并且上下文关闭时,bean 将被释放并调用 PreDestroy。
如果 PostConstruct 抛出异常,则 Bean 在上下文中不可用(并且应用程序不会启动),因此不会调用 PreDestroy。
The question is how to make the most correct release of application resources? Is that enough to make it in @PreDestroy annotated method or I should also catch the exception in @PostConstract annotated method?
您应该捕获异常并释放任何非托管资源。这也适用于 JEE,它指定作为最佳实践,必须以编程方式处理在上下文之外获取的资源。
详情@PostConstruct
and @PreDestroy
annotations allow you to define lifecycle callbacks for your beans (see the documentation。
如果@PostConstruct
注解的方法可能会抛出异常,你应该捕获它们并相应地处理资源的释放。考虑以下示例:
@SpringBootApplication
public class MySpringApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
@PostConstruct
public void init() {
System.out.println("@PostConstruct method executed");
throw new RuntimeException();
}
@PreDestroy
public void destroy() {
System.out.println("@PreDestroy method executed");
}
}
在这种情况下,@PreDestroy
注解的方法不会被执行。