【发布时间】:2017-08-17 02:00:31
【问题描述】:
在我的 JavaEE 应用程序中,我有一个 @Singleton 类,其中包含一些 @Scheduled 方法。此外,还有@PostConstruct 和@PreDestroy 的方法来设置和清理数据库。 (为简单起见,我只登录了示例,因为这会重现问题。)应用程序必须在 JBoss EAP 6.3.0.GA 服务器上运行。
虽然@PostConstruct 方法工作正常,但在我关闭服务器时不会调用@PreDestroy(在 Eclipse 中按下 stop the server 按钮或使用来自jboss-cli)。这是一些重现问题的代码:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Singleton
@Startup
public class TimerBean {
private static final Logger log = LoggerFactory.getLogger(TimerBean.class);
@PostConstruct
private void postConstruct() {
log.info("PostConstruct called");
}
@PreDestroy
private void preDestroy() {
log.info("PreDestroy called");
}
}
在服务器启动期间,@PostConstruct 消息出现在日志中。但是在关闭服务器时,没有出现日志消息。
如何让服务器调用@PreDestroy方法?
编辑:由于@PreDestroy方法不是清理数据库的合适位置,所以这个问题已经过时了。
【问题讨论】:
-
您是否在 Wildfly 8 或 EAP 7 中尝试过?只是为了确保它不是 EAP 6.3.0 中的错误。在这里找到这个:access.redhat.com/solutions/291713 但似乎在您的版本中已修复
-
你在 Jboss 7 AS 中试过这个吗?我看不到任何问题,这应该可以。但有一件事,数据库清理任务不应该在 preDestroy 中完成,它只是做一些资源清理。但在您的示例中,它只是一个 log.info
-
当我将它部署到 Wildfly 8 时,也没有
@PreDestroy消息。@hunter 当 PreDestroy 不是进行数据库清理的正确位置时,我还能在哪里做呢? (如果有比@PreDestroy更好的解决方案,我不关心为什么这不起作用)