118 votes

Pourquoi le frai des discussions dans le conteneur de Java EE est déconseillée ?

Une des premières choses que j’ai appris sur le développement de Java EE est que je ne devrais pas frayer mon propre fils à l’intérieur d’un conteneur J2EE. Mais quand je viens d’y penser, je ne sais pas la raison. Pouvez-vous nous expliquer clairement pourquoi elle est déconseillée ?

Je suis sûr que la plupart des applications d’entreprise ont besoin d’une sorte de travaux asynchrones comme courrier démons, idle séances travaux etc... Alors, si en effet, on ne devrait pas générer de threads, ce qui est la façon correcte de le faire si nécessaire ?

84voto

Robin Points 15032

Il est découragé parce que toutes les ressources de l'environnement sont destinés à être gérés, et potentiellement surveillé par le serveur. Aussi, le contexte dans lequel un thread est utilisé est en général attaché à l'exécution du thread lui-même. Si vous commencez simplement à votre propre thread (qui, je crois, certains serveurs ne permettent même pas), il ne peut pas accéder à d'autres ressources. Ce que cela signifie, c'est que vous ne pouvez pas obtenir un InitialContext et ne JNDI recherches pour accéder à d'autres ressources du système, telles que les Fabriques de Connexion JMS et les Sources de données.

Il y a des façons de le faire "correctement", mais il est dépendant de la plate-forme utilisée.

Le commonj WorkManager est commun pour WebSphere et WebLogic, ainsi que d'autres

Plus d'info ici

Et ici

Aussi un peu de doublons cette une de ce matin

34voto

Dan Dyer Points 30082

Pour les Ejb, ce n'est pas seulement découragé, il est expressément interdit par la spécification:

Un haricot d'entreprise ne doit pas utiliser le thread des primitives de synchronisation pour synchroniser l'exécution de plusieurs les instances.

et

Le haricot d'entreprise ne doit pas tenter pour gérer les threads. L'entreprise bean ne doit pas tenter de démarrer, arrêter, suspendre ou reprendre un fil, ou à changer la priorité d'une tâche ou d'un nom. Le haricot d'entreprise ne doit pas tenter pour gérer thread groupes.

La raison en est que les Ejb sont destinés à fonctionner dans un environnement distribué. Un EJB peuvent être déplacés d'une machine dans un cluster à l'autre. Threads (et de prises de courant et autres restreint d'installations) sont un obstacle important à cette portabilité.

13voto

kgiannakakis Points 62727

La raison que vous ne devriez pas vous frayer votre propre fils, c'est que ces ne sera pas géré par le conteneur. Le conteneur prend en charge beaucoup de choses qu'un débutant développeur est difficile à imaginer. Par exemple des choses comme la mise en pool de threads, le regroupement, le crash de recouvrement est effectué par le conteneur. Lorsque vous démarrez un fil, vous risquez de perdre certains de ceux-ci. Aussi le récipient vous permet de redémarrer votre application sans affecter la JVM, il fonctionne sur. Comment cela serait possible si il y a des fils du conteneur de contrôle?

Ce pour cette raison qu'à partir de J2EE 1.4 minuterie services ont été introduits. Voir cet article pour plus de détails.

2voto

Vous pouvez toujours dire le conteneur pour démarrer les choses dans le cadre de vos descripteurs de déploiement. Ceux-ci peuvent alors faire quelque tâches de maintenance que vous devez faire.

Suivre les règles. Vous serez heureux un jour que vous avez fait  :)

2voto

Ojitha Points 21

Discussions sont interdits dans les conteneurs de Java EE selon les plans. Veuillez consulter les plans pour plus d’informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X