2009-01-31 4 views
5

J'ai actuellement un conteneur tomcat - servlet fonctionnant en écoute de requêtes. J'ai besoin du résultat d'une requête HTTP pour être une soumission à une file d'attente qui sera ensuite traitée de manière asynchrone. Je veux que chaque «travail» soit conservé de suite dans une base de données pour le suivi et la récupération en cas d'échec. J'ai beaucoup lu. Voici mes options (notez que je dois utiliser des trucs open-source pour tout).Traitement asynchrone en Java à partir d'une servlet

1) JMS - utiliser ActiveMQ (mais qui est le consommateur du travail dans ce cas, une autre servlet)

2) Demandez à ma demande de créer une ligne dans la DB?. Avoir une servlet séparée à l'intérieur de mon conteneur Tomcat qui s'exécute toujours - il utilise Quartz Scheduler ou les utilitaires fournis dans java.util.concurrent pour traiter en continu les lignes comme des tâches (utilise le pool de threads). Je penche pour ce dernier parce que regarder la documentation JMS me donne mal à la tête et même si je sais que c'est une solution plus robuste, j'ai besoin de l'implémenter relativement rapidement. Je ne prévois pas d'énormes quantités de charge dans les premiers jours de déploiement de ce serveur dans tous les cas. Beaucoup de gens disent que le printemps pourrait être bon pour 1 ou 2. Cependant, je n'ai jamais utilisé Spring et je ne sais même pas comment commencer à l'utiliser pour résoudre ce problème. Tout pointeur sur la façon de plonger sans avoir à réécrire tout mon projet serait utile.

Sinon, si vous pesez sur l'option 1 ou 2 qui serait également utile. Clarification: Le processus asynchrone consisterait à filtrer un site Web tiers et à envoyer une notification de message au demandeur d'origine. Le site Web tiers est un peu flou et lent et c'est pourquoi il sera traité comme un processus asynchrone (plusieurs tentatives de tentatives intégrées). Je vais également extraire les fichiers de ce site et les stocker dans S3.

Répondre

4

Votre travail au quartz n'a pas besoin d'être une servlet! Vous pouvez conserver les Jobs entrants dans la DB et démarrer Quartz lorsque votre Servlet principale démarre. Le travail Quartz peut être un simple POJO et vérifier périodiquement la base de données pour tous les travaux.

Cependant, je suggère de jeter un oeil à Spring. Ce n'est pas difficile à apprendre et easy to setup within Tomcat. Vous pouvez trouver beaucoup de bonnes informations dans le Spring reference documentation. Il a l'intégration de Quartz, ce qui est beaucoup plus facile que de le faire manuellement.

+0

Je vous recommande également de printemps à la fois pour la planification et la messagerie JMS Quartz. Cela rendra le code beaucoup plus simple. – kgiannakakis

1

Une solution appropriée qui ne nécessitera pas de beaucoup de conception et de programmation est de créer l'objet dont vous aurez besoin plus tard dans la servlet et de le sérialiser en un tableau d'octets. Ensuite, mettez cela dans un champ BLOB dans la base de données et faites-le avec. Ensuite, votre thread de traitement peut simplement lire le contenu, le désérialiser et travailler avec l'objet ressuscité.

Mais, vous pouvez obtenir de meilleures réponses en décrivant ce que vous avez besoin de votre système pour réellement faire :)

+0

C'est une assez bonne idée. Cela fonctionnerait probablement pour moi car l'objet que je stockerais dans la base de données contient simplement des informations sur la façon d'accéder au site tiers cible et possède un identifiant unique pour que je puisse le renvoyer à l'utilisateur. – Ish

Questions connexes