定时器服务: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
我认为它会对其他人有用。
实际上,我正在将应用程序从 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 我认为它会对其他人有用。