为什么Jboss将空计时器对象传递给带有@Timeout注释的方法?

为什么Jboss将空计时器对象传递给带有@Timeout注释的方法?,jboss,timer,timeout,ejb,schedule,Jboss,Timer,Timeout,Ejb,Schedule,我有一个无状态bean,它管理我的计时器服务: @Stateless @Depends("jboss.ha:service=HASingletonDeployer,type=Barrier") public class TimerManagerBean implements ITimerManagerLocal { private static final Logger log = Logger.getLogger(TimerManagerBean.class); private @Resou

我有一个无状态bean,它管理我的计时器服务:

@Stateless
@Depends("jboss.ha:service=HASingletonDeployer,type=Barrier")
public class TimerManagerBean implements ITimerManagerLocal {

private static final Logger log = Logger.getLogger(TimerManagerBean.class);
private @Resource
SessionContext ctx;

private @EJB ISomeEjbLocal someEjb;

public void scheduleTimer(long initialDuration, long intervalDuration, Serializable info) {
    if (info.equals(ITimerManagerLocal.TIMER_ID_1)) {
        ctx.getTimerService().createTimer(initialDuration, intervalDuration, info);
    } 
}

@Override
public void cancelTimer(Serializable info) {
    final Collection<Timer> timers = ctx.getTimerService().getTimers();
    for (final Timer timer : timers) {
        if (timer.getInfo().equals(info)) {
            log.info("Timer[info=" + info + "] found, cancelling...");
            timer.cancel();
            log.info("Timer[info=" + info + "] cancelled");
        }
    }
}

@Override
@Timeout
public void timeoutHandler(Timer timer) throws Exception {
    Serializable info = timer.getInfo();
    if (ITimerManagerLocal.TIMER_ID_1.equals(info)) {
               someEjb.doSomething(); // what happen if this throw exception?

    } 
    } 
}
}
我用它来创建/取消/安排计时器。这个服务过去可以正常工作几个月,但现在它开始将null timer对象传递给timeoutHandler方法,该方法抛出NullPointerException。每次调用timeoutHandler方法时都会发生这种情况。 我使用postgres来存储计时器信息,而不是hsdb。 我想这是在我进入9级后开始发生的,但我不明白为什么,也不知道我错了。 另外,当timer.getInfo抛出NullPointerException(因为timer为null)时,timeoutHandler方法中会发生什么情况。这个异常在哪里抛出?它会阻止计时器的正确重新安排吗


谢谢。

如果传递给timeoutHandler的计时器为空,那听起来像是JBoss中的一个bug。在我的测试和开发环境中不会发生这种情况。
@Local
public interface ITimerManagerLocal {

public static final String TIMER_ID_1 = "TIMER_ID_1";

public void scheduleTimer(long initialDuration, long intervalDuration, Serializable info);

public void cancelTimer(Serializable info);

public void timeoutHandler(Timer timer) throws Exception;
}