实际上,我正在将应用程序从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:请参见嵌套异常;嵌套的异常是: java.lang.IllegalStateException:计时器服务:Bean没有 计时器: BeanId(LeadDeliverySystemEAR#timedrequest.jar#TimedRequestBean,null) java.lang.IllegalStateException:计时器服务:Bean没有 计时器: BeanId(LeadDeliverySystemEAR#timedrequest.jar#TimedRequestBean,null) 在com.ibm.ejs.container.BeanO.getTimers(BeanO.java:1733)处 com.ford.it.request.async.TimedRequestBean.cancelTimers(TimedRequestBean.java:460)
答案 0 :(得分:0)
TimerService.getTimers()
会引发IllegalStateException。为了避免这种情况,bean必须使用@Scheulde
声明一个自动计时器,或者使用@Timeout
声明编程计时器的超时回调方法(或任一注释的XML等效方法)。
基本上,TimerService
对于不可能具有计时器的bean不可访问。由于没有@Timeout
方法,因此无法在TimerService
上调用任何create方法。同样,由于该bean没有计时器,因此也不允许调用getTimers()
。
答案 1 :(得分:0)
最后我找到了解决方案。我已经在我的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 我认为这对其他人会有用。