Exécution d'un événement en arrière-plan régulier dans l'application Web Java

StackOverflow https://stackoverflow.com/questions/48293

  •  09-06-2019
  •  | 
  •  

Question

Dans le podcast n°15, Jeff a mentionné qu'il avait tweeté sur la façon d'organiser un événement régulier en arrière-plan comme s'il s'agissait d'une fonction normale - malheureusement, je n'arrive pas à trouver cela via Twitter.Maintenant, je dois faire une chose similaire et je vais poser la question aux masses.

Mon plan actuel est que lorsque le premier utilisateur (probablement moi) entre sur le site, il démarre un fil d'arrière-plan qui attend l'heure impartie (toutes les heures), puis lance l'événement en bloquant les autres (je suis un programmeur Windows de métier, donc Je pense en termes d'événements et WaitOnMultipleObjects) jusqu'à ce qu'il soit terminé.

Comment Jeff l'a-t-il fait dans Asp.Net et sa méthode est-elle applicable au monde des applications Web Java ?

Était-ce utile?

La solution

Je pense que développer une solution personnalisée pour exécuter des tâches en arrière-plan ne vaut pas toujours la peine, je recommande donc d'utiliser le Planificateur de quartz en Java.

Dans votre situation (besoin d'exécuter des tâches en arrière-plan dans une application Web), vous pouvez utiliser le ServletContextListener inclus dans la distribution pour initialiser le moteur au démarrage de votre conteneur web.

Après cela, vous disposez d'un certain nombre de possibilités pour démarrer (déclencher) vos tâches en arrière-plan (jobs), par ex.vous pouvez utiliser des calendriers ou des expressions de type cron.Dans votre situation, vous devriez probablement vous contenter de Déclencheur simple qui vous permet d'exécuter des tâches à intervalles fixes et réguliers.

Les tâches elles-mêmes peuvent également être décrites facilement dans Quartz, mais vous n'avez fourni aucun détail sur ce que vous devez exécuter, je ne peux donc pas fournir de suggestion dans ce domaine.

Autres conseils

Comme mentionné, Quartz est une solution standard.Si vous ne vous souciez pas du clustering ou de la persistance des tâches en arrière-plan lors des redémarrages, vous pouvez utiliser la prise en charge intégrée de ThreadPool (dans Java 5,6).Si vous utilisez un Service d'exécution planifié vous pouvez placer les Runnables dans le pool de threads d'arrière-plan qui attendent un laps de temps spécifique avant de s'exécuter.

Si vous vous souciez du clustering et/ou de la persistance, vous pouvez utiliser les files d'attente JMS pour une exécution asynchrone, même si vous aurez toujours besoin d'un moyen de retarder les tâches en arrière-plan (vous pouvez utiliser Quartz ou ScheduledExecutorService pour ce faire).

Le mécanisme de Jeff consistait à créer une sorte d'objet mis en cache qu'ASP.Net recréerait automatiquement à un certain intervalle. Cela semblait être une solution spécifique à ASP.Net, donc cela ne vous aidera probablement pas (ou moi) beaucoup dans le monde Java.

Voir https://stackoverflow.fogbugz.com/default.asp?W13117

Atwood :Eh bien, j'ai initialement demandé sur Twitter, parce que je voulais juste quelque chose de léger.Je ne voulais vraiment pas aimer écrire un service Windows.J'avais l'impression que c'était hors du code du groupe.De plus, le code qui fait réellement le travail est en fait une page Web, car pour moi, une unité logique de travail sur un site Web est une page Web.Donc, c'est vraiment comme si nous rappelions le site Web, c'est comme une autre demande sur le site Web, donc je l'ai considéré comme quelque chose qui devrait rester en ligne, et la petite approche que nous avons proposée m'a été recommandée sur Twitter. était essentiellement d'ajouter quelque chose au cache de l'application avec une expiration fixe, puis vous avez un rappel donc quand cela expire, il appelle une certaine fonction qui fait le travail, puis vous l'ajoutez au cache avec la même expiration.Donc, c'est un peu, peut-être que « ghetto » est le bon mot.

Mon approche a toujours été de se tourner vers le système d'exploitation (c'est-à-direCron ou le planificateur de tâches Windows) chargez une URL spécifique à un certain intervalle, puis configurez une page sur cette URL pour vérifier sa file d'attente et effectuer toutes les tâches requises, mais je serais intéressé de savoir s'il existe un meilleur moyen.

D'après la transcription, il semble que FogBugz utilise également le service Windows en chargeant une approche URL.

Spolski :Nous avons donc cette page spéciale appelée heartbeat.asp.Et cette page, chaque fois que vous la visitez, et n'importe qui peut la consulter à tout moment :ça ne fait pas mal.Mais lorsque cette page s'exécute, elle vérifie une file d'attente de tâches en attente pour voir si quelque chose doit être fait.Et s'il y a quelque chose à faire, il fait une chose, puis regarde à nouveau dans cette file d'attente et s'il y a autre chose à faire, il renvoie un plus, et la page Web entière qu'il renvoie n'est qu'un seul caractère avec un plus. dedans.Et s'il n'y a rien d'autre à faire, la file d'attente est désormais vide, elle renvoie un moins.Ainsi, n'importe qui peut appeler ceci et l'appuyer autant de fois, vous pouvez charger heartbeat.asp dans votre navigateur Web, vous appuyez sur Ctrl-R Ctrl-R Ctrl-R Ctrl-R jusqu'à ce que vous commenciez à obtenir des inconvénients au lieu d'avantages.Et lorsque vous aurez fait cela, FogBugz aura terminé tous les travaux de maintenance qu'il doit effectuer.Voilà donc la première partie, et la deuxième partie est un service Windows très, très simple qui s'exécute, et tout son travail est d'appeler heartbeat.asp et s'il obtient un plus, rappelez-le bientôt, et s'il reçoit un appel moins encore une fois, mais pas avant un moment.Donc, fondamentalement, il y a ce service Windows qui est toujours en cours d'exécution, qui a une tâche très, très, très simple consistant simplement à accéder à une URL, et à regarder s'il obtient un plus ou un moins, puis à planifier son exécution à nouveau en fonction de si ça a eu un plus ou un moins.Et évidemment, vous pouvez faire n'importe quelle sorte de variation que vous voulez sur ce thème, comme par exemple, euh vous pourriez réellement, au lieu de retourner juste un plus ou moins vous pourriez dire "ok rappelez-moi en 60 secondes" ou "rappelez-moi bien Loin, j'ai plus de travail à faire. " Et c'est comme ça que ça marche ...donc ce service de maintenance s'exécute simplement, vous savez, c'est comme, vous savez, une demi-page de code qui exécute ce service de maintenance, et il n'a jamais besoin de changer, et il n'a aucune logique là-dedans, c'est juste contient le chatouillement qui provoque l'appel de ces pages Web avec une certaine fréquence garantie.Et à l'intérieur de cette page Web sur heartbeat.asp, il y a du code qui maintient une file d'attente de tâches à effectuer et regarde combien de temps s'est écoulé et effectue, vous savez, une maintenance nocturne et supprime tous les sept jours tous les messages plus anciens qui ont été marqués comme spam et toutes sortes de tâches de maintenance en arrière-plan.Et euh, c'est comme ça que ça fait ça.

Nous utilisons jtcron pour nos tâches en arrière-plan planifiées.Cela fonctionne bien et si vous comprenez cron, cela devrait avoir du sens pour vous.

Voici comment ils procèdent sur StackOverflow.com :

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top