Je suis obligé d'exécuter une tâche périodique à l'aide d'un temporisateur qui est appelé à un intervalle différent de la période pendant laquelle je souhaite exécuter cette tâche.Exécution de tâches périodiques à l'aide d'un temporisateur avec un intervalle différent comme prévu
Notez que le délai d'attente ne se produit pas à 100% avec précision; par exemple, timeout (javax.ejb.Timer timer) dans le code ci-dessous pourrait être invoqué à des intervalles de 100, 98, 105ms etc
Donc, je suis venu avec cela, ce qui est en quelque sorte d'accord. Mais occasionnellement, la tâche sera exécutée deux fois avant que l'intervalle prévu ne passe, ou l'intervalle devient un peu plus long que ce que j'ai l'intention de faire.
Avez-vous une meilleure idée de cela? (code est pseudo-code simplifié, sera utilisé dans un conteneur EJB)
import javax.annotation.Resource;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
public class TimerBean {
private static final long TASK_INTERVAL = 1530;
private static final long TIMEOUT = 100;
@Resource
private TimerService timerService;
public void startTimer() {
timerService.createTimer(100, TIMEOUT, null);
}
@Timeout
public void timeout(javax.ejb.Timer timer) {
if(isApproxTime(timer, TASK_INTERVAL)){
//do stuff
}
}
private boolean isApproxTime(Timer timer, long targetInterval) {
long modulus = timer.getNextTimeout().getTime() % targetInterval;
return modulus < TIMEOUT;
}
}
EDIT: Je voudrais éviter état autre que ejb.Timer, permettant ainsi d'économiser le temps de dernière invocation est pas une option .
Je ne pense pas que tout cadre de minuterie java peut fournir 100% garantie. Sur une autre note avez-vous essayé quartz scheduler http://www.quartz-scheduler.org/ – saugata
Non, ce n'est pas grave si ce n'est pas garanti à 100% ... Aussi nous utilisons un conteneur EJB, donc nous ne voulons pas utiliser quelque chose qui a son propre fil. –