“通过@Resource注入TimerService时,”在JNDI上下文中找不到注入数据“

时间:2014-03-07 13:24:17

标签: java java-ee cdi tomee openejb

我要尝试使用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第一次找到注射数据,而不是下一次注射数据?我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

我终于解决了!似乎@Observes(during = TransactionPhase.AFTER_COMPLETION)注释导致了这个问题。删除参数并简单地离开@Observes对我来说是个窍门。

我不知道为什么,但问题可能与TransactionPhase.AFTER_COMPLETION中隐含的交易行为有关。删除后的方法的默认行为是非事务性的(请参阅documentation)。