2010-10-22 2 views
1

J'utilise Timertask dans mon application Web pour lancer un fil d'arrière-plan toutes les 24 heures tous les jours à minuit. J'ai donc un ServletContextListener et dans contextInitialized, je crée un objet Timertask (say) et un objet Timer disons t.La tâche de minuterie ne s'exécute pas

J'appelle

t.schedule(timertask, firstTime.getTime(), rescheduleMiliSec); 

firstTime.getTime() = midnight et rescheduleMiliSec = 24 hr. Le thread se lance bien et fait ce qu'il est censé faire en DIT. Chaque 24 heures, il lance la tâche d'arrière-plan. Lorsqu'il passe à PROD, le thread s'exécute une seule fois lorsque le contexte est initialisé mais pas après.

Y a-t-il un paramètre spécifique qui pourrait en être la cause?

Répondre

2

Est-il possible que votre implémentation TimerTask lève une exception RuntimeException?

Si ce n'est pas une exception, une TimerTask planifiée dans ce temporisateur bloque indéfiniment. Ce sont les deux seules conditions dont je suis conscient qui pourraient faire échouer un chronomètre.

BTW, vous pourriez vouloir regarder dans un ScheduledExecutorService. C'est la façon la plus moderne de planifier les tâches.

+0

Lorsque le contexte est d'abord initialisés, le TimerTask fonctionne correctement et il n'y a exception. Plus tard aussi, il n'y a pas d'exception. Cela ne fonctionne tout simplement pas. – Victor

+0

Étant donné que cette question est urgente pour moi de résoudre, si une solution réelle est difficile à trouver, une solution de contournement comme ci-dessous fonctionnera également. J'aurais quand même besoin d'aide pour l'implémenter: Puisque la logique réside dans contextinitialised(), chaque fois que l'application est redéployée, le contexte s'initialise et la logique s'exécute. Existe-t-il un moyen de redéployer automatiquement l'application chaque jour à minuit? peut-être un script? C'est un peu désordonné, mais ça va faire pour l'instant ... – Victor

+0

@ user454671, mis à jour ma réponse. En ce qui concerne le redéploiement de l'application, vous pourriez probablement vous pencher sur un travail chronologique ... mais cela ne semble pas être une solution raisonnable. –

0

Dans la méthode contextInitialized après la planification d'une tâche à l'aide de TimerTask, existe-t-il un code ci-dessous qui peut provoquer une exception.

1

Je pense que la raison est simple mais elle peut échapper à l'œil nu.

firstTime.getTime() 

est en millisecondes et la méthode suivante ont la priorité:

schedule(TimerTask task, long delay, long period) 

INSEAD de l'usage prévu:

schedule(TimerTask task, Date firstTime, long period) 
Questions connexes