我在无状态会话bean中的一个方法上配置计划注释时遇到了问题。
@Schedule(minute = "*/5", hour = "*", persistent = false)
@Override
public void retrieveDoc() {
try {
//--- --- --- --- --- --- ---
} catch (InterruptedException ex) {
}
}
我希望我的方法每5分钟执行一次。然而,这个执行在大约7天后停止。有什么东西我错过了吗?只要服务器启动并运行,我希望此方法每5分钟运行一次。
对此的任何暗示都非常感谢。
感谢。
答案 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.
}
}