定时器服务:Bean 在 EJB3.1 中没有定时器

Timer Service: Bean does not have timers in EJB3.1

实际上,我正在将应用程序从 EJB2.1 迁移到 EJB3.1。更改应用程序后,我在调用 getTimers() 方法时遇到问题。

我正在使用 Websphere 服务器。

这是我的代码:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class TimedRequestBean implements TimedRequestLocal {    
    @Resource
    private SessionContext sessionContext;
    public void cancelTimers() {
            TimerService ts = this.sessionContext.getTimerService();
            Collection timers = ts.getTimers();
            Iterator it = timers.iterator();
            while (it.hasNext()) {
                Timer myTimer = (Timer)it.next();
                myTimer.cancel();
            }
       }
}

日志:

javax.ejb.EJBException: See nested exception; nested exception is: java.lang.IllegalStateException: Timer Service: Bean does not have timers: BeanId(LeadDeliverySystemEAR#timedrequest.jar#TimedRequestBean, null) java.lang.IllegalStateException: Timer Service: Bean does not have timers: BeanId(LeadDeliverySystemEAR#timedrequest.jar#TimedRequestBean, null) at com.ibm.ejs.container.BeanO.getTimers(BeanO.java:1733) at com.ford.it.request.async.TimedRequestBean.cancelTimers(TimedRequestBean.java:460)

TimerService.getTimers() 如果未声明 bean 具有任何计时器,则抛出 IllegalStateException。为避免这种情况,bean 必须使用 @Scheulde 来声明自动计时器,或使用 @Timeout 来声明编程计时器的超时回调方法(或 XML 等价于任一注释)。 =17=]

基本上,TimerService 不能被不可能有计时器的 bean 访问。由于没有 @Timeout 方法,none 的创建方法可能会在 TimerService 上被调用;同样,由于该 bean 不存在计时器,因此也不允许调用 getTimers()

终于找到解决办法了。我已经在我的 bean 中实现了 TimedObject 接口,它工作正常。这是我的代码。

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class TimedRequestBean implements TimedRequestLocal, TimedObject {    
    @Resource
    private SessionContext sessionContext;
    public void cancelTimers() {
            TimerService ts = this.sessionContext.getTimerService();
            Collection timers = ts.getTimers();
            Iterator it = timers.iterator();
            while (it.hasNext()) {
                Timer myTimer = (Timer)it.next();
                myTimer.cancel();
            }
       }
}

来源:http://itdoc.hitachi.co.jp/manuals/3020/30203Y0610e/EY060069.HTM 我认为它会对其他人有用。