2009-10-14 5 views
2

Je ne sais pas exactement quelle question poser ici puisque je ne connais pas le vocabulaire ...processus avec état (démons?) Dans Tomcat?

Les servlets Tomcat (et n'importe quel serveur d'ailleurs) fonctionnent bien s'ils sont sans état et répondent rapidement aux requêtes, avec état stocké dans une base de données. Il semble que si j'ai des opérations de longue durée alors peut-être que je veux exécuter un autre service en arrière-plan, et que les gestionnaires Tomcat communiquent avec lui. Existe-t-il un moyen d'exécuter une application Java de longue durée dans la même JVM que Tomcat et d'interagir avec celle-ci via une servlet Tomcat "normale"?


Exemple: Disons que je veux offrir un certain nombre RESTful service factorisation en HTTP.

Voici un scénario possible (j'espère avoir le droit de syntaxe HTTP, je suis en omettant la plupart des en-têtes):

# comments start with #, > = request, < = response 
# 
# first we create a queue 
> POST /factorizer/create-queue 
> {information here} 
< queue=12345B 
# then we post some numbers to it 
> POST /factorizer/queue/12345B 
> 123 
> 456 
> 678 
> 123456789
< OK 
# let's look at the status 
> GET /factorizer/queue/12345B/status 
< requested=4 
< processed=3 
# query 
> GET /factorizer/queue/12345B/7 
< Error: invalid index 
> GET /factorizer/queue/12345B/3 
< Error: not complete 
> GET /factorizer/queue/12345B/0 
< 123=3*41 
# wait a while 
> GET /factorizer/queue/12345B/status 
< requested=4 
< processed=4 
> GET /factorizer/queue/12345B/3 
< 123456789=3*3*3*7*13*31*37*211*241*2161*3607*3803*2906161 

Je peux penser à la façon d'écrire le servlet pour gérer les requêtes, mais Comment puis-je implémenter un service démon/fonctionnement indépendant dans la même machine virtuelle Java?

modifier: Dans l'exemple ci-dessus, ce que je voudrais faire est d'avoir une application d'arrière-plan qui fonctionne de manière autonome, avec des files d'attente de travail, pour tenir compte des nombres premiers, et dispose d'une interface Java qui prend en charge les opérations que le Tomcat Les servlets pourraient utiliser pour exposer le service sur le web. Ensuite, je n'ai pas à m'inquiéter de l'interface Web ou du protocole HTTP dans mon application d'arrière-plan, et je n'ai pas à m'inquiéter des problèmes de multithreading ou de la factorisation en nombres premiers dans mes servlets.

+0

sont tous les servlets dans la même application web? –

+0

oui. (juste curieux: qu'est-ce qui changerait si je disais non, mais ils étaient tous des servlets Tomcat dans la même JVM?) –

+0

Si je me souviens bien, les applications Tomcat dans la même JVM sont isolées les unes des autres. Au lieu de Tomcat, vous auriez besoin de quelque chose comme JBoss qui fait Enterprise Java Beans. Alternativement, vous pouvez mettre beaucoup de servlets dans une seule application Tomcat et ils peuvent se voir. –

Répondre

1

Si vous n'avez pas absolument besoin d'être dans la même machine virtuelle Java (si vous n'avez pas besoin d'accéder directement aux objets), vous pouvez écrire une autre application Tomcat et faire en sorte que vos autres applications communiquent avec elle. HTTP à localhost. En effet, vous écrivez un service Web qui s'exécute sur la même machine. (Je ne sais pas comment les applications Tomcat peuvent se voir les unes les autres.Ce problème est résolu par Enterprise Java Beans, mais cela peut être une solution trop lourde pour vous.)

Si vous n'avez qu'une seule application Tomcat Pour cela, créez un thread de travail et placez-le dans le contexte de l'application où toutes les requêtes peuvent communiquer avec lui.

En ce qui concerne votre problème spécifique, il semble que vous décriviez quelque chose comme le modèle de travail asynchrone dans le livre O'Reilly "Restful Web Services". Cela utilise le code d'état "202 Accepted" pour indiquer que le traitement n'est pas terminé. Voir "Opérations asynchrones" au chapitre 8 du livre.

http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=sr_1_1?ie=UTF8&s=books&qid=1255555328&sr=8-1

+0

"contexte d'application"? Y a-t-il un tutoriel pour ça? Je connais assez bien les threads de travail pour savoir comment gérer la plupart des aspects multithreading/concurrent. –

+0

Votre servlet étend HttpServlet. HttpServlet.getServletContext() renvoie le ServletContext (ou le "scope d'application") vu par toutes les demandes. ServletContext.setAttribute (nom de la chaîne, valeur de l'objet) et ServletContext.getAttribute (nom de la chaîne) vous permettent d'y placer tout ce que vous voulez.Un tutoriel Java Server Pages a probablement le plus d'invormations à ce sujet. –

+0

oh, propre. ça sonne comme ce que je veux. Merci! –