J'utilise Java et je souhaite maintenir un servlet en cours d'exécution dans mon application, mais je ne sais pas comment le faire. Mon servlet a une méthode qui donne le nombre d'utilisateurs à partir d'une base de données sur une base quotidienne ainsi que le nombre total d'utilisateurs de toute la base de données. Je veux donc que le servlet continue de fonctionner pour cela.
97
Réponses:
Votre problème est que vous ne comprenez pas le but du servlet . Il est destiné à agir sur les requêtes HTTP, rien de plus. Vous voulez juste une tâche d'arrière-plan qui s'exécute une fois par jour.
EJB disponible? Utilisation
@Schedule
Si votre environnement prend en charge EJB (c'est-à-dire un vrai serveur Java EE tel que WildFly, JBoss, TomEE, Payara, GlassFish, etc.), utilisez à la
@Schedule
place. Voici quelques exemples:Oui, c'est vraiment tout. Le conteneur le récupérera et le gérera automatiquement.
EJB indisponible? Utilisation
ScheduledExecutorService
Si votre environnement ne prend pas en charge EJB (c'est-à-dire que vous n'utilisez pas un vrai serveur Java EE, mais un conteneur de servlet simple tel que Tomcat, Jetty, etc.), utilisez
ScheduledExecutorService
. Cela peut être initié par unServletContextListener
. Voici un exemple de lancement:Où les classes d'emplois ressemblent à ceci:
Ne pensez jamais à utiliser
java.util.Timer
/java.lang.Thread
dans un environnement basé sur Java EE / ServletLast but not least, n'utilisez jamais directement
java.util.Timer
et / oujava.lang.Thread
dans Java EE. C'est la recette des ennuis. Une explication détaillée peut être trouvée dans cette réponse relative à JSF sur la même question: Générer des threads dans un bean géré JSF pour les tâches planifiées à l'aide d'un minuteur .la source
ScheduledExecutorService
: Assurez-vous de capturer toutes les exceptions dans votre exécuteur testamentaire. Si une exception s'échappe de votrerun
méthode, l'exécuteur s'arrête silencieusement de s'exécuter. Ceci est une fonctionnalité et non un bug. Lisez le document et étudiez avec googler.scheduler.shutdownNow()
n'est pas correctement invoqué selon l'exemple. Si cela n'est pas appelé, le thread de planification continuera effectivement à fonctionner.Je suggérerais d'utiliser une bibliothèque comme le quartz afin d'exécuter la tâche à intervalles réguliers. Que fait vraiment la servlet? Il vous envoie un rapport?
la source
Mettre en œuvre deux classes et appeler
startTask()
àmain
.la source
Vous pouvez utiliser cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
la source
Dans un système de production qui peut avoir plusieurs conteneurs non-jee en cours d'exécution. Utilisez un planificateur d'entreprise non tel que le planificateur Quartz qui peut être configuré pour utiliser une base de données pour la tâche maamgememt.
la source