EJB计划问题

时间:2015-03-30 18:46:52

标签: java-ee timer ejb

我在无状态会话bean中的一个方法上配置计划注释时遇到了问题。

@Schedule(minute = "*/5", hour = "*", persistent = false)
@Override
public void retrieveDoc() {
    try {

        //--- --- --- --- --- --- --- 
    } catch (InterruptedException ex) {

    }
}

我希望我的方法每5分钟执行一次。然而,这个执行在大约7天后停止。有什么东西我错过了吗?只要服务器启动并运行,我希望此方法每5分钟运行一次。

对此的任何暗示都非常感谢。

感谢。

2 个答案:

答案 0 :(得分:1)

你的计时器应该每五分钟一次。您是否有可能在该方法中遇到异常?如果在@Schedule方法中抛出异常,则该方法将在5秒后再次调用,如果失败,则计时器将死亡。

答案 1 :(得分:1)

因为这是ejb,所以默认情况下是事务性的。为了有效地捕获抛出的异常,将逻辑包装到另一个ejb调用中,专门在不同的事务中调用该方法。

@Stateless
public class MySchedules{

  @EJB
  private MyScheduleService scheduleService;

  @Schedule(minute="*/5", hour="*")
  public void scheduleMe() {
     try {
       //The logic here is that you cannot catch an exception 
       //thrown by the current transaction, but you sure can catch
       //an exception thrown by the next transaction started 
       //by the following call.
       scheduleService.doTransactionalSchedule();
     }catch(Exception ex) {//log me}
  }
}

@Stateless
@TransactionAttribute(REQUIRES_NEW)
public class MyScheduleService {

   public void doTransactionalSchedule() {
     //do something meaningful that can throw an exception.
   }
}