【问题标题】:@PreDestroy method not called in @Singleton on JBoss EAP 6.3.0在 JBoss EAP 6.3.0 上的 @Singleton 中没有调用 @PreDestroy 方法
【发布时间】: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更好的解决方案,我不关心为什么这不起作用)

标签: java jboss java-ee-6


【解决方案1】:

这不是您问题的答案,这是您在上一条评论中提出的问题的答案。 实际上我想不出一个合适的地方来做这件事。其他人可能会帮你弄清楚。 但无论如何@PostContruct 和@PreDestory 可能不是事务的一部分,这就是为什么在这些方法中进行数据库操作不好的原因,

但是为了您的帮助,我附上了我从一本书(掌握 EJB 3.0)中摘录的内容,

【讨论】:

  • 谢谢,感谢您的回答!
  • 这就是为什么在@PreDestory 方法中清理数据库资源不是一个好主意
猜你喜欢
  • 2015-03-07
  • 1970-01-01
  • 2017-01-09
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多