2011-05-17 2 views
1

Je dois pouvoir réaliser deux tâches de filetage dans un conteneur et avoir besoin de comprendre les meilleures pratiques pour ce faire. Voici les deux classes de tâches que j'ai besoin d'accomplir:Quelle est la meilleure pratique pour gérer les pools d'unités d'exécution dans un conteneur?

  1. Lors d'un appel de services Web, j'ai besoin de démarrer un thread qui continue le traitement après que la réponse a été envoyée. Aucun message n'est requis à l'expéditeur d'origine lorsque le traitement est terminé.
  2. Un appel de services Web peut avoir besoin de générer plusieurs threads qui doivent s'exécuter parallèlement les uns aux autres. La réponse à la demande d'origine doit être bloquée jusqu'à ce que tous les travailleurs aient terminé. Les éléments de la réponse seront tirés des morceaux de chacun des résultats du fil.

Bien sûr, je pourrais créer ma propre instance d'un java.util.concurrent.Executor et l'utiliser, mais je pense que les conteneurs pourraient être assez intelligents pour en fournir un qu'ils gèrent. FWIW - J'utilise WebSphere 6.1 sur JDK 1.5.0 (je sais, ancien ... mais c'est ce que c'est). Je cours des services Web développés en utilisant Apache CXF, donc je suis dans le conteneur de servlet, mais configuré avec Spring.

+0

Connexes: http://stackoverflow.com/questions/5357033/background-timer-task-in-jsp-web-application/5357856#5357856 La réponse se résume à: "Dépend du conteneur, lisez sa documentation /Manuel". Vous pouvez recadrer votre question en "Comment utiliser un pool de threads géré WebSphere?" si vous échouez à déchiffrer la documentation IBM. – BalusC

Répondre

1

Pour 1) vous pourriez vouloir regarder les beans asynchrones. Vous pouvez également utiliser un bean géré par message qui récupère et actionne un message que vous envoyez à une file d'attente. Il y a les trucs Quartz du printemps que vous voudrez peut-être voir aussi. Je pense qu'avec Servlet 3 (aucune chance sur WAS 6.1!) Vous pouvez obtenir le support asynchrone sans l'approche Async Work Manager ou JMS, mais jusque-là je ne connais pas de meilleur moyen que ces patterns. Pour 2) généralement bloquer la demande est une entreprise risquée (que se passe-t-il si vous atteignez le délai d'expiration). Cependant, vous êtes dans le conteneur de servlet, vous pouvez donc utiliser quelque chose de java.util.concurrent, par exemple. ExecutorService comme vous l'avez mentionné. Vous pouvez également utiliser la messagerie pour envoyer le travail ailleurs et le bloquer jusqu'à la fin.

+0

Question éditée pour inclure plus de mes détails (re: conteneur EJB, etc). – Jared

+0

merci - j'ai mis à jour la réponse avec ce que je sais. – planetjones

+0

asynchbeans est le mécanisme pris en charge par WebSphere pour le travail asynchrone créé par l'application. –

0

En règle générale, je ne démarre pas les threads à l'intérieur d'un conteneur car il est possible que la conformité totale de j2ee soit activée et que votre application meure. Sous conformité totale, les threads ne peuvent pas être créés. Qu'est-ce que vous voulez faire est de mettre en place une file d'attente JMS que vous soumettez votre "travail à faire". Vous pouvez alors avoir un MDB en écoutant la file d'attente qui effectue l'opération que votre thread aurait fait.

Questions connexes