【问题标题】:@PostConstruct executed twice in class with @Singleton and @Startup on JBoss 7@PostConstruct 在 JBoss 7 上使用 @Singleton 和 @Startup 在课堂上执行了两次
【发布时间】:2014-02-03 02:00:40
【问题描述】:

我有以下课程:

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import javax.inject.Inject;

import com.mysite.Config;

@Startup
@Singleton
public class Scheduler {

    @Resource
    private TimerService timerService;

    @Inject @Config
    private Logger log;

    @Inject @Config
    private Integer delay;

    @Inject @Config
    private Integer interval;

    @Inject @Config
    private Boolean enabled;

    @PostConstruct
    public void initTimer() {
        if (enabled) {
            TimerConfig tc = new TimerConfig();
            tc.setPersistent(false);
            timerService.createIntervalTimer(delay, interval, tc);
        }
    }

    @Timeout
    public void timeout(Timer timer) {
        // do something
    }
}

包结构:

  • Java
    • dataloaders(这里是有问题的类)
    • 其他包
  • 资源
    • META-INF、配置等

在部署到 JBoss 7.1.1 时,该类的 initTimer 方法总是被调用两次,这会导致每次调用超时两次。

我已经从herehere 知道这是 JBoss 中的一个错误(据说已在 7.1.1 中修复,但显然不是)。那么我的问题是 - 有没有人知道我可以用来停止 @PostConstruct 方法的双重执行的任何解决方法(我有更多这样的类,它们都有同样的问题)?

我见过更多这样的问题,但它们都与某个 REST 库或 Spring 和 CDI 初始化 bean 两次有关 - 这里不是这种情况。

任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 请添加您的导入语句,以及您的包装结构。
  • 已添加,如果您需要更多信息,请告诉我。
  • 你的 EJB jar 在 WAR 中吗?
  • 这是一个带有war包装的单pom项目。 EJB 没有 jar,一切都在 WEB-INF/classes 下。这会是个问题吗?这是我们从另一家公司继承的项目,我什至还没有考虑过包装。
  • 我曾经遇到过类似的问题,是因为 beans.xml 重复,一个在 src/main/webapp/WEB-INF,另一个在 src/main/resources/META-INF。可能值得检查。

标签: java jakarta-ee jpa jboss cdi


【解决方案1】:

原来这是应用程序打包的问题,​​第二个应用程序在下面,它的 xml 配置再次被拾取,导致对象被构造两次。我的错,感谢@hwellmann 的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2013-05-29
    • 1970-01-01
    • 2012-10-19
    • 2019-05-13
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多