我要尝试使用TimerService
实例在Tomee 1.6.0服务器上的单例EJB上动态调度某些执行。调度第一次工作,但在后续执行时,我收到以下错误(在Tomee控制台中),并且调度似乎停止在应用程序中工作:
mar 07, 2014 1:27:06 PM org.apache.openejb.cdi.CdiResourceInjectionService fillInjectionProperties
WARNING: Injection data not found in JNDI context: jndiName='comp/env/myapp.Bean/timerService', target=myapp.Bean/timerService
尝试实现此目的的EJB看起来像这样:
package myapp;
@Singleton
public class Bean implements Serializable {
private static final long serialVersionUID = 1L;
@Resource
private transient TimerService timerService;
private Timer oldTimer = null;
public Bean() {
super();
}
public void schedule(
@Observes(during = TransactionPhase.AFTER_COMPLETION) @ScheduleEvent ScheduleExpression schedule) {
if (oldTimer != null) {
oldTimer.cancel();
}
try {
return oldTimer = timerService.createCalendarTimer(schedule, new TimerConfig("TIMER", true));
} catch (IllegalArgumentException e) {
throw new EJBException(e);
}
}
@Timeout
@Lock(LockType.READ)
private void timeout(Timer timer) {
// Do stuff...
}
}
从schedule
触发的事件触发Bean
的{{1}}方法,该事件监视“.properties”文件(存储调度计时信息)并触发必要的只要它检测到任何变化,就会发生事件:
ConfigBean
为什么Tomee第一次找到注射数据,而不是下一次注射数据?我怎样才能让它发挥作用?
答案 0 :(得分:2)
我终于解决了!似乎@Observes(during = TransactionPhase.AFTER_COMPLETION)
注释导致了这个问题。删除参数并简单地离开@Observes
对我来说是个窍门。
我不知道为什么,但问题可能与TransactionPhase.AFTER_COMPLETION
中隐含的交易行为有关。删除后的方法的默认行为是非事务性的(请参阅documentation)。