2009-04-23 7 views
6

J'ai une application Web à l'aide du printemps et mise en veille prolongée et des entretoises (il fonctionne sur Tomcat)Threads au printemps

La séquence d'appel est quelque chose comme ça ...

l'action Struts appelle haricot de service ressort qui, à son tour appelle le bean Spring DAO. L'implémentation DAO est une implémentation Hibernate.

La question est Est-ce que tous mes haricots de printemps courraient dans le même fil? Puis-je stocker quelque chose dans le ThreadLocal et l'obtenir dans un autre haricot?

Je suis assez sûr que cela ne fonctionnerait pas dans le bean session sans état. Le conteneur EJB peut (ou va) générer un nouveau thread pour chaque appel au bean session

Le conteneur à ressort fera-t-il de même? c'est-à-dire exécuter tous les haricots dans le même fil?

Quand j'ai essayé un test JUnit -. Je suis le même identifiant via Thread.currentThread() getId() dans le cas de test et les deux HARICOTS qui me conduit à croire qu'il n'y avait qu'un seul fil dans l'action

Ou le comportement est-il imprévisible? Ou changera-t-il lors de l'exécution sur le serveur Tomcat?

Clarification Je ne souhaite pas échanger de données entre deux threads. Je veux mettre des données dans le ThreadLocal et être capable de le récupérer de tous les beans de la pile d'appels. Cela ne fonctionnera que si tous les beans sont dans le même thread

+0

Pourriez-vous poster des échantillons de code s'il vous plaît? Je ne suis pas sûr de ce que vous essayez d'atteindre. –

Répondre

15

Le ressort ne génère pas les threads. Tomcat fait. Le printemps est juste en train de créer et de câbler les objets pour vous.

Chaque demande du navigateur est traitée dans une requête. C'est Tomcat qui gère la requête. C'est Tomcat qui crée le thread pour traiter la requête.

En supposant que vous venez de créer un bean singleton au printemps appelé "X". Ensuite, la même instance de X est utilisée par toutes les demandes.

Les haricots de printemps ne vivent pas dans un fil. Ils sont juste alloués sur le tas.

+0

Donc, lorsque vous utilisez Tomcat, mon flux de bout en bout sera-t-il sous un seul thread? –

+0

Oui, en supposant que tout se passe sur la même instance de serveur d'applications. –

+0

C'est la meilleure explication jusqu'à présent. –

1

Est-ce que tous mes haricots de printemps courraient dans le même fil? Puis-je stocker quelque chose dans le ThreadLocal et obtenir dans un autre haricot? AFAIK pour les composants que vous avez mentionnés (haricot de service, haricot DAO - je suppose qu'ils sont des haricots de printemps simples), le printemps ne génère pas un nouveau fil. Je ne comprends pas votre cas d'utilisation (c'est-à-dire l'échange de données entre deux threads).

Pour la plupart des webapps, un nouveau thread est généré pour chaque nouvelle demande, et si vous souhaitez partager des données entre deux demandes que vous normalement: - utiliser les get/paramètres de poste pour transmettre les données - utiliser la session pour partager des données

Pour répondre à votre question, je suis à peu près sûr que le conteneur à ressort ne génère pas de filetage pour la plupart des composants.

+0

Je ne souhaite pas échanger de données entre deux threads. Je veux mettre des données dans le fil et être capable de le récupérer de tous les beans de la pile d'appels. Cela ne fonctionnera que si tous les beans sont dans le même thread ... –

0

Oui, vous pouvez le faire.Le même thread sera utilisé pour exécuter votre action afin que ThreadLocal fonctionne. Généralement, le même thread est également utilisé pour le bean de session sans état, en supposant qu'il s'exécute dans la même instance de serveur d'applications. Je ne dépendrais pas de cela, car il dépend probablement du fournisseur.

Nous utilisons cette technique pour accéder à l'identité des appelants n'importe où dans le code. Nous utilisons également les beans session et jms, mais passons explicitement l'information entre les conteneurs et définissons ThreadLocal à chaque point d'entrée. De cette façon, peu importe si le bean (session ou mdb) est local ou non.

+0

Je ne pensais pas qu'il utilisait réellement un bean session sans état? Je présumais qu'il utilisait des POJO au printemps comme alternative. –

+0

et, par défaut, Spring créera vos beans en singletons, ce qui signifie que la même instance est partagée entre toutes les requêtes. Mais s'il stocke quelque chose dans ThreadLocal, cela n'a pas d'importance. –

+0

Je suppose que votre point de vue sur POJO est correcte, mais il a mentionné qu'il ne pensait pas que cela fonctionnerait, donc je suppose que cela pourrait être une autre alternative à laquelle il pensait (avec ou sans le printemps). Je pensais juste que je lui donnerais des informations à ce sujet aussi bien sur la base de mes propres expériences en faisant quelque chose de similaire. – Robin

0

En plus de toutes les autres réponses, je vais simplement ajouter ce qui suit:

Normalement, la seule raison pour passer des fils est en raison d'une exigence pour parallellity. Comme cela ne vient normalement pas gratuitement en termes de complexité, vous serez généralement clairement informé lorsque cela se produit.

La commutation de threads dans ce qui semble être un traitement monothread d'une requête est en réalité extrêmement complexe. Cela se produira normalement à un seul endroit dans un conteneur, et ceci est généralement géré par les lecteurs de socket tcp/ip qui reçoivent la requête des clients externes. Ces threads de lecteur déterminent généralement quel thread (pool) doit traiter la requête et transmettre la requête à ce thread. Après cela, la requête reste avec ce thread.

Normalement, la seule chose qui peut/peut arriver est que des threads supplémentaires soient créés pour un traitement parallèle ou asynchrone (comme JMS).