2009-02-11 5 views
4

J'ai une application GWT qui affiche certains graphiques rendus par JFreeChart. Toutes les quelques minutes, la page s'actualise, ce qui entraîne la création de nouveaux graphiques par l'application. (En d'autres termes, l'ensemble du processus de génération de diagrammes est amorcé par une requête client.) Le problème avec ceci est que plusieurs clients frappant le même serveur produiraient plusieurs requêtes pour générer des diagrammes, mais puisque les diagrammes sont identiques pour tous les utilisateurs, il n'y a vraiment aucune raison de le faire. Je voudrais prerender les diagrammes dans un thread d'arrière-plan, qui serait lancé au démarrage de l'application, puis simplement servir les graphiques déjà rendus au client sur demande.Lancement de threads d'arrière-plan sur le démarrage de GWT

Je ne vois aucun moyen "sanctionné" dans GWT pour exécuter votre propre code au démarrage du serveur. La seule façon de le faire est de créer une servlet chargée au démarrage par le conteneur d'application et de lancer le thread de génération de graphique dans la méthode init().

Y a-t-il une manière plus préférée de faire cela?

Note: En supposant que c'est vrai, "non" est une réponse parfaitement acceptable.

Répondre

6

Pour répondre à votre question: Non. GWT est une technologie frontale, et le seul bit de GWT qui traverse cette ligne est le mécanisme RPC. Le seul moyen de type 'GWT' que vous pourriez faire serait de vérifier si les fichiers de graphiques existent la première fois qu'un utilisateur les demande, et de les générer s'ils ne le font pas. Cela signifie que vous utiliserez le système de fichiers pour vérifier s'il a été créé ou non. Le meilleur moyen serait de faire ce que vous avez dit, par exemple: configurer votre projet web pour lancer une classe au démarrage. Vous faites cela dans votre web.xml comme décrit ici:

http://wiki.metawerx.net/wiki/Web.xml.LoadOnStartup

Voici un exemple de la façon dont Stripes-t-il:

<servlet> 
     <servlet-name>StripesDispatcher</servlet-name> 
     <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>StripesDispatcher</servlet-name> 
     <url-pattern>*.action</url-pattern> 
    </servlet-mapping> 
+0

+1 Stripes! :) –

2

Tout d'abord, je suis en désaccord avec l'affiche avant que GWT est Une technologie frontale seulement, puisque le framework inclut tout pour construire et invoquer des services de façon asynchrone. Voir, par exemple, RemoteServiceServlet et usages. GWT fournit des composants côté client et côté serveur. Cela dit, GWT ne semble pas avoir spécifiquement de servlet de type startup. Mais, comme le back-office est basé sur servlet, je serais enclin, par souci de cohérence, à utiliser une servlet de démarrage (recherche sur google), et l'avoir générer les graphiques au démarrage, puis périodiquement au besoin.

Une alternative serait d'avoir un travail cron qui reconstruit périodiquement les graphiques, soit directement, soit en invoquant un service privé.

Dans les deux cas, les demandes du client récupéreraient simplement le graphique pré-généré. Quand un nouveau graphique est généré, il suffit de l'échanger à la place de l'ancien, de sorte qu'il n'y ait pas de retard perceptible pour l'utilisateur.

0

GWT est une infrastructure frontale. J'ai un composant de serveur spécifique, mais ceux-ci ne sont utilisés que pour sérialiser/désérialiser les requêtes du client. Rappelez-vous que le frontal est en JavaScript et que le back-end est en Java. Ainsi, les composants du serveur convertissent un objet JavaScript en sa représentation java. Si vous regardez votre code, vous pouvez remarquer que GWT RemoteServiceServlet hérite simplement des standards "javax.servlet.http.HttpServlet", comme n'importe quelle servlet. Il implémente juste sa propre méthode doPost et doGet pour effectuer la sérialisation. Cela dit, votre question pourrait s'appliquer à une multitude d'autres cadres.Il ne dépend pas de GWT. Vous avez juste besoin de configurer votre conteneur de servlet pour démarrer GWT RemoteServiceServlet au démarrage. Le servlet peut avoir le cache statique utilisé par tous les clients et fournir le même graphique. Vous pouvez alors démarrer un deuxième thread au démarrage qui met à jour le thread périodiquement.

+0

Il fait le marshaling, comme vous dites. GWT gère également les liaisons de méthode, ce qui est utile. Ce que je veux dire en disant que c'est à la fois le front et le back-end, c'est de contrer l'idée que GWT est juste pour le client, et vous devrez l'épouser avec quelque chose à l'arrière. Vous venez d'implémenter les méthodes de servlet. –

3

Je ne suis pas d'accord que vous devriez mettre du code dans l'initialisation de la servlet pour créer ces threads. Lorsque l'application web est arrêtée, vous ne pouvez pas contrôler quand détruire ces threads. Aussi, lorsque vous démarrez l'application Web à nouveau, va-t-elle créer de nouveau ces threads? Quoi de mieux que d'utiliser l'événement J2EE ServletContextListener nommé contextInitialized pour créer les threads et l'événement contextDestroyed pour détruire vos threads. Cela vous permet également de contrôler la destruction des threads et d'attendre que le code des threads finisse d'être exécuté avant de les détruire.

ressemble à ceci explique comment cela fonctionne: http://www.java-tips.org/java-ee-tips/java-servlet/how-to-work-with-servletcontextlistener.html

Questions connexes