Tâche de minuterie de fond dans L'application web JSP / Servlet [dupliquer]

cette question a déjà une réponse ici:

je veux récupérer de l'abonnement et stocker des flux à la DB de l'abonnement après toutes les 6 heures. Je veux avoir un fil de minuterie en arrière-plan pour accomplir cette tâche.

Quel est le meilleur moyen? Un fil de minuterie normal ou une API Quartz?

21
demandé sur BalusC 2011-03-18 22:41:52

1 réponses

pour commencer, je n'utiliserais pas JSP pour ça. Il n'est pas pour.

lorsque vous êtes sur Java EE 5, Utilisez les API de jobschuling fournies pour cela. Plus de détails dépendent du conteneur que vous utilisez. JBoss comme 5 par exemple les bateaux avec le Quartz sur la boîte. Ou lorsque vous utilisez un framework sur le dessus de JSP / Servlet qui offre des API jobcheduling, comme Spring , alors vous devriez l'utiliser.

s'il n'y en a pas (par exemple, vous utilisez juste Tomcat 6), ou vous voulez être indépendant du conteneur et/ou du cadre, créer un ServletContextListener avec un ScheduledExecutorService . Plus de détails peuvent être trouvés dans cette réponse .

ou lorsque vous êtes déjà sur un conteneur Java EE 6 qui supporte EJB 3.1 (JBoss AS 6, GlassFish 3, mais donc pas Tomcat 7), le plus facile est de créer un @Singleton EJB avec @Schedule méthode.

@Singleton
public class UpdateSubscriptions {

    @Schedule(hour="*/6", minute="0", second="0", persistent=false)
    public void run() {
        // Do your job here.
    }

}        

C'est ça. Aucune configuration supplémentaire n'est nécessaire.


mise à jour : selon les commentaires, vous utilisez Tomcat (6 ou 7?). Pour lancer un thread pendant le démarrage de webapp qui exécute la tâche toutes les 6 heures, utilisez l'exemple fourni dans le réponse précommandée et faire le suite au changement de scheduleAtFixedRate() méthode

scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);

la classe UpdateSubscriptions doit mettre en œuvre Runnable et le travail réel doit être fait dans le run() méthode que vous @Override , comme dans l'exemple de la réponse liée.

40
répondu BalusC 2017-05-23 12:09:02