2009-11-13 7 views
5

J'utilise Quartz pour planifier des tâches d'arrière-plan pour une application Web. Certaines de ces tâches déclenchent simplement des requêtes contre la même application Web. Je veux éviter de dépendre de n'importe quel type de paramètres réseau (par exemple, une demande avec mon propre nom de domaine pourrait ne pas être routée correctement si elle est faite depuis le centre de données). Existe-t-il une API Java pour déclencher un ServletRequest et le faire gérer par Tomcat en interne (sans HTTP réel impliqué)? Je veux toujours encapsuler le travail dans une requête Servlet plutôt que d'appeler le code Java pour les tâches d'arrière-plan directement, de sorte que je puisse revenir à la demande HTTP régulière comme option de configuration.Éteindre une requête Servlet interne dans Tomcat

Le code spécifique à Tomcat est acceptable.

Répondre

0

Notion intéressante. Il n'y a certainement pas d'API standard pour cela, et je ne pense pas non plus qu'il existe un mécanisme spécifique à Tomcat.

Que recevrait la demande? Une servlet? JSP? Contrôleur de printemps? En fonction de cela, et en fonction de ce que la cible fait, vous pouvez éventuellement appeler la cible directement, plutôt que de l'acheminer via le conteneur. Mais si vous avez des JSP, une pile de filtres et d'autres complexités de servlet, c'est probablement n'est pas une option. Si sur le coup vous utilisez Spring, alors votre travail de Quartz pourrait juste être câblé directement avec le contrôleur et ce serait facile comme vous voudrez. Es-tu si chanceux?

+1

Je veux passer par une URL (par opposition à appeler les contrôleurs directement) afin que je puisse revenir à HTTP plus tard. Garde les choses découplées. – Thilo

+0

API standard: Si j'étais dans une servlet moi-même, je suppose que je pourrais faire requestDispatcher.include (fakedRequest, fakedResponse). Mais je ne suis pas. – Thilo

1

Que voulez-vous obtenir de ces tâches planifiées? Le comportement standard du serveur Web consiste à obtenir une requête HTTP et à répondre avec des données particulières. Je suppose que vos tâches n'en ont pas besoin, c'est-à-dire que vous voulez simplement effectuer un traitement particulier dont la base de code réside dans l'application Web. Si l'hypothèse ci-dessus est correcte, vous pouvez simplement découpler la logique servlet/jsp de la logique de traitement métier et appeler les classes de couche logique métier directement à partir de vos tâches planifiées.

0

Utilisez URLConnection, ou apache-commons httpclient avec localhost/127.0.0.1 - il sera donc routé correctement.

+1

Cela suppose que le serveur écoute sur 127.0.0.1, ce qui n'est pas toujours le cas. – skaffman

+0

qu'en est-il de 0.0.0.0? :) – Bozho

0

Le code de servlet a trop de responsabilités. Refactorisez-le en une classe Java simple vanille et laissez la classe de tâche y accéder (ou inversement, laissez-la visiter la classe de tâche). Si nécessaire, utilisez judicieusement le ServletContext.

Si vous développez un peu plus sur le problème réel et les exigences fonctionnelles pour lesquelles vous pensez que c'est la solution, nous pouvons proposer de bien meilleures suggestions.

+0

"problème réel et exigence fonctionnelle": Je n'ai pas vraiment besoin de faire cela, je veux juste savoir si je pouvais. – Thilo

+0

Vous pouvez le faire avec 'java.net.URLConnection' ou Apache Commons HttpClient comme mentionné plusieurs fois. L'image complète est cependant un peu une odeur, je voulais juste avertir à ce sujet avant qu'il ne soit trop tard. – BalusC

Questions connexes