【发布时间】: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 方法总是被调用两次,这会导致每次调用超时两次。
我已经从here 和here 知道这是 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