2010-03-04 15 views
0

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 .

+1

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

+0

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. –

Répondre

1

Il s'agit effectivement d'exigences bizarres. Mais que diable. Pouvez-vous créer des minuteurs quand vous le voulez?

Si c'est le cas, ajustez l'intervalle de tâche en fonction de la durée restante avant l'expiration de votre intervalle cible, ou d'une quantité moindre. Cela dérivera, mais la durée entre les événements sera à peu près égale à votre cible.

Je n'ai pas une impression solide de votre code sur le contrôle que vous avez sur les choses. Par exemple, existe-t-il une fenêtre de TIMEOUT que vous êtes autorisé à spécifier? Ou est-ce qu'une seule valeur vous est dictée, et vous n'avez aucun contrôle à ce sujet?

Si c'est le dernier (pas de contrôle du tout), alors ce que vous avez mis ensemble est à peu près tout ce que vous pouvez faire. Personnellement, je repousserais HARD sur l'exigence de ne pas stocker l'état dans ce bean. L'état en question n'est pas du tout persistant ou quoi que ce soit d'autre qui pourrait en faire un problème.

+0

Merci pour votre réponse. Nous avons eu d'autres problèmes découlant de cette exigence, et nous avons finalement éliminé cette exigence. Maintenant, j'utilise simplement le bon intervalle! –

0

Quartz devrait vous donner plus de minuteries précises et plus contrôlables