2010-10-04 8 views
0

J'ai ce problème. Afin de créer une réponse pour une seule requête http, je dois effectuer plusieurs tâches qui peuvent être effectuées simultanément. Je peux effectuer ces tâches dans un Executor (pool de threads), mais je dois m'inquiéter de la concurrence (synchronisation) dans mon application Web. Existe-t-il une meilleure façon de résoudre ce problème sans utiliser le pool de threads?Requête http et pool de threads

Merci,

Répondre

1

Utilisation d'un Exécuteur prend soin des détails méprisables de la synchronisation des threads, il devrait donc être la meilleure façon d'effectuer plusieurs tâches en même temps. Vous venez de soumettre des tâches à l'exécuteur et d'attendre qu'elles se terminent.

Si ces tâches d'arrière-plan accèdent à une ressource partagée (en particulier les structures de données en mémoire), cet accès doit être coordonné. Le plus simple est d'éviter les ressources partagées, mais si vous pouvez le faire, cela dépend de ce que vous avez réellement besoin de faire. Si vous devez disposer de ressources partagées, vous pouvez utiliser des primitives de synchronisation Java ou d'autres utilitaires du package de simultanéité.

Vous ne pouvez pas avoir plusieurs threads et ne pas penser à la synchronisation. Aucune balle d'argent ici. (Par ailleurs, même sans plusieurs threads pour une seule requête web, vous devez probablement considérer les problèmes de thread dans une application web, car le même serveur web peut être touché par plusieurs requêtes simultanément).

+0

Je pensais à 2 solutions possibles: 1 est d'avoir 2 conteneur Web qui est identique et un conteneur Web est en train de transmettre à un autre. Donc, la vraie tâche est effectuer dans un autre conteneur. La deuxième solution consiste à placer toutes les tâches dans une file d'attente jms et à attendre que les résultats reviennent. Cependant, ces deux solutions nécessitent 2 conteneurs Web. Qu'est ce que tu penses de ça? –

+0

De quel type de tâches parlons-nous? Si elles peuvent être terminées en quelques secondes, un pool de threads dans le même conteneur Web avec la demande en attente du résultat semble approprié. Si elles prennent beaucoup de temps (plus de dix secondes), vous devriez probablement utiliser quelque chose comme JMS et ne pas faire attendre la requête (retourner immédiatement, afficher une barre de progression, interroger pour compléter avec de nouvelles requêtes). – Thilo

+0

il s'attend à être terminé en quelques secondes. Est-ce une bonne pratique d'avoir un pool de threads dans votre conteneur Web? –

Questions connexes