Я столкнулся с одной и той же проблемой, но решил ее немного по-другому.
@Singleton
public class DoStuffTask {
@Resource
private TimerService timerSvc;
@Timeout
public void doStuff(Timer t) {
try {
doActualStuff(t);
} catch (Exception e) {
LOG.warn("Error running task", e);
}
scheduleStuff();
}
private void doActualStuff(Timer t) {
LOG.info("Doing Stuff " + t.getInfo());
}
@PostConstruct
public void initialise() {
scheduleStuff();
}
private void scheduleStuff() {
timerSvc.createSingleActionTimer(1000l, new TimerConfig());
}
public void stop() {
for(Timer timer : timerSvc.getTimers()) {
timer.cancel();
}
}
}
Это работает, настраивая задачу для выполнения в будущем (в данном случае за одну секунду). В конце задачи он снова планирует задачу.
EDIT: Обновлено для рефакторинга «материала» в другой метод, чтобы мы могли защищать исключения, чтобы всегда происходило перепланирование таймера