- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我们在 JavaEE 6 的 @PostConstruct 方法中遇到了一个更复杂的初始化问题。有几个地方可能会出错,并且可能会出现异常。在那种情况下,我们可能有一个半初始化的 bean。
在这种情况下是否调用了@PreDestroy 方法?我们可以在那里检查我们的资源,并在必要时释放它们。或者我们是否需要捕获 @PostConstruct 中的所有异常并清除那里的所有内容?规范对此并不清楚(或者我没有找到)。
或者,由于缺乏规范,它是否特定于供应商?在 JBoss 7.x 上怎么样?
最佳答案
我认为 EJB3.1 规范在这种情况下很明确:如果您在 PostConstruct 中获取了非托管资源,那么您必须自己释放它们以防出现异常。
第 14.3.3 节 - session Bean 的 PostConstruct 和 PreDestroy 方法的异常容器操作:记录异常或错误。 如果是单例,则回滚任何容器启动的事务。 丢弃实例。
第 14.3.11 节 - 资源发布当容器因为系统异常而丢弃实例时,容器应该释放实例持有的所有资源,这些资源是通过在企业 bean 环境中声明的资源工厂获取的(参见 16.7 小节)。
注意:虽然容器应该释放实例通过在企业 bean 环境中声明的资源工厂获取的与资源管理器的连接,但通常情况下,容器不能释放实例可能通过其获取的“非托管”资源JDK API。例如,如果实例打开了 TCP/IP 连接,大多数容器实现将无法释放连接。连接最终会被JVM垃圾回收机制释放。
以下两节指定在 EJB 业务方法或@PostContruct 中发生 RuntimeException 时不调用 @PreDestroy 方法:
4.7.3处理异常企业 bean 类的任何方法(包括业务方法和容器调用的生命周期回调拦截器方法)抛出的不是应用程序异常的 RuntimeException 导致转换到“不存在”状态。异常处理在第 14 章中有详细描述。有关生命周期回调拦截器方法的规则,请参阅第 12.5.1 节,当多个此类方法应用于 bean 类时。从客户端的角度来看, session 对象继续存在。客户端可以继续访问 session 对象,因为容器可以将客户端的请求委托(delegate)给另一个实例。
12.5.1异常生命周期回调拦截器方法可能会抛出系统运行时异常,但不会抛出应用程序异常。任何生命周期拦截器回调方法抛出的运行时异常都会导致 bean 实例及其拦截器在拦截器链展开后被丢弃[59]。当 bean 和拦截器因此类异常而被丢弃时,不会调用 PreDestroy 回调:链中的生命周期回调拦截器方法应在拦截器链展开时执行任何必要的清理操作。
关于jakarta-ee - @PreDestroy 是否在 JavaEE 6 中的 @PostConstruct 异常后被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14599421/
摘要:有谁知道如何让 @PreDestroy 在应用程序范围托管 bean 的回收\超时时触发? 几周前我发布了一个关于“预定代理”的问题:30 sec periodic task to poll e
我发现 @PreDestroy 只适用于 singleton scoped bean。我在想如果我们将它与 prototype 作用域 bean 一起使用会出什么问题。有什么事吗???我不这么认为。我
这个问题已经有答案了: How to get access to javax.annotation.Resource at run time in Java 9 (2 个回答) Java 9 migr
这个问题在这里已经有了答案: JSF 2.1 ViewScopedBean @PreDestroy method is not called (2 个回答) 2年前关闭。 我有一个 @ViewScop
我有一个 spring 上下文,其中我们有可运行的 bean,如下所示: public void startChildAndWait(Class type) { BaseMyDispatcher
像 @PreDestroy 这样的东西在 Spring 框架中? 最佳答案 如果你定义了一个实现 DisposableBean 接口(interface)的 bean,那么 Spring 将调用 vo
我有一个集成测试类,注释如下 @WebAppConfiguration @ContextConfiguration(classes = {AppConfiguration.class}) @RunWi
我无法理解 EJB 容器如何为带有实例变量的 @Stateless bean 管理线程安全。因此,在解释我的担忧之前,我将举一个简单的例子: @Stateless public class BeanT
我有一个使用 @PostConstruct 和 @PreDestory 注释的简单 Web 服务。 @PostConstruct private void init() {...} //initial
这是一个运行在 WAS8.0 上的 JSF 2 应用程序。这是一页的“支持”bean 的代码。 @Named("mySessionBean") @SessionScoped @
而且在 spring-boot 应用程序中,我们不会在任何地方关闭上下文,那么 Web 应用程序如何管理此关闭上下文并销毁工作的 bean。 实际上这个Web应用程序何时会触发上下文关闭并触发@Pre
我是 Spring Boot 的新手,我有一个 Spring Boot 应用程序似乎忽略了 @PreDestroy 注释 - 当我从命令行或通过 Eclipse 运行时,我从来没有看到应用程序时正在运
似乎资源对 Singleton 的 @Predestroy 方法不可用。 @PreDestroy public void cleanup() { logger.info("*** Applic
我正在使用 Spring,并在终止时让 @PreDestroy 清理 bean。我不明白为什么随机登录有时会成功,而其他人会失败。 // Using Log4j2 Logger log = LogMa
在这篇文章中,我们将讨论如何使用方法级注解@PostConstruct和@PreDestroy来定制Bean的性质。 注意,@PostConstruct和@PreDestroy注解不属于Spring,
我有应用程序逻辑在 @RequestScoped bean 中编写协议(protocol)文件。我想在 @SessionScoped bean 过期之前编写协议(protocol)。 @Session
我在内部创建 bean 的 Controller 类中使用 @controller。对于这个 Controller ,我需要使用@postConstruct 和@preDestroy 方法,@post
我创建了一个请求范围的 bean,一旦请求结束,它应该调用一个方法。我尝试使用 @PreDestroy 带注释的方法来执行此操作,但这不起作用。 @Component @Scope(value = "
我有 SpringBoot 应用程序,它加载一些配置并在用 @PostConstract 注释的方法中运行长时间处理。如果应用程序成功完成或出现错误,则应释放一些资源。 问题是如何最正确地释放应用资源
拥有 Spring Boot 应用程序,在调用 Shutdown hook @Predestroy 方法时,会调用应用程序关闭。但在打印日志后,控制台和文件、sys out 行中均不打印日志。看起来,
我是一名优秀的程序员,十分优秀!