EJB - quand utiliser des interfaces distantes et / ou locales?

Je suis très nouveau sur Java EE et j'essaie de comprendre le concept des interfaces locales et des interfaces distantes. On m'a dit que L'un des grands avantages de Java EE est qu'il est facile à mettre à l'échelle (ce qui signifie que je crois que vous pouvez déployer différents composants sur différents serveurs). Est-ce là que les interfaces distantes et locales entrent en jeu? Êtes-vous censé utiliser des interfaces distantes si vous vous attendez à ce que votre application ait différents composants sur différents serveurs? Et utilisez des interfaces locales si votre l'application va seulement résider sur un serveur?

Si mes hypothèses ci-dessus sont correctes, comment choisiriez-vous d'utiliser des interfaces locales ou distantes pour une nouvelle application, où vous ne savez pas quel serait le volume de trafic? Commencez par utiliser des interfaces locales et passez progressivement aux interfaces distantes le cas échéant?

Merci pour toute clarification et suggestions.

164
demandé sur Pritam Banerjee 2010-09-28 00:39:05

4 réponses

Je suis très nouveau sur Java EE et j'essaie de comprendre le concept des interfaces locales et des interfaces distantes.

Dans les versions initiales de la spécification EJB, les EJB étaient "supposés" être des composants distants et la seule façon de les appeler était de faire un appel distant, en utilisant la sémantique RMI et toute la surcharge qu'il implique (un appel réseau et une sérialisation d'objet pour chaque appel de méthode). Les clients EJB ont dû payer cette pénalité de performance même lorsqu'ils sont colocalisés dans le même virtuel machine avec le conteneur EJB.

Plus tard, Sun a réalisé que la plupart des applications métier ne distribuaient pas les EJB sur un niveau différent et ils ont corrigé la spécification (dans EJB 2.0) en introduisant le concept d'interfaces locales afin que les clients collocalisés dans la même machine virtuelle avec le conteneur EJB puissent appeler les EJB en utilisant l'invocation directe de

On m'a dit que L'un des grands avantages de Java EE est qu'il est facile à mettre à l'échelle (ce qui signifie que je crois que vous pouvez déployer différents composants sur différents serveurs)

Java EE peut évoluer, mais cela ne signifie pas nécessairement distribuer composants. Vous pouvez exécuter une application web + EJB sur un cluster sans séparer le niveau Web et le niveau EJB.

Êtes-vous censé utiliser des interfaces distantes si vous vous attendez à ce que votre application ait des composants différents sur des serveurs différents? Et utilisez des interfaces locales si votre l'application va seulement résider sur un serveur?

Je l'exprimerais comme ceci: utiliser des interfaces distantes si le client n'est pas dans la même JVM (cela ne signifie pas utiliser un seul serveur/JVM).

(...) Commencez par utiliser des interfaces locales et passez progressivement aux interfaces distantes le cas échéant?

Je commencerais probablement par utiliser des interfaces locales. Et comme déjà laissé entendre, le passage aux interfaces distantes n'est pas toujours obligatoire (vous pouvez regrouper un colocalisé structure).

Je suggère de vérifier les ressources mentionnées ci-dessous (les 2 premières sont assez anciennes mais toujours pertinentes, les 2 autres sont plus récentes).

Ressources

167
répondu Pascal Thivent 2010-09-28 15:59:41

Bien que je sois d'accord avec la plupart de ce qui est écrit ci-dessus, je voudrais affiner un peu les idées "comment commencer".

Ma suggestion est de ne jamaisjamais programmer directement sur les interfaces EJB dans votre code. Utilisez toujours une interface régulière et orientée métier, programmez-la (ce qui signifie que vos méthodes d'appel de code sur l'interface orientée métier) et fournissez le code "glue" EJB comme implémentation enfichable. Votre programme devrait être axé sur la logique métier, et non sur détails d'implémentation tels que EJB.

De cette façon, vous pouvez facilement basculer entre les implémentations distantes et locales - et si vous utilisez un conteneur IoC tel que Spring, vous pouvez le faire uniquement au moyen de la configuration.

Une note spéciale sur le passage du local au distant: notez qu'il existe quelques différences sémantiques entre les deux. Par exemple, l'appel d'une méthode EJB via son "interface distante" entraîne des arguments passés par-value, tout en appelant via "l'interface locale" résultats dans les arguments passés par référence. C'est une différence majeure; donc si vous "commencez par local", assurez-vous que vous concevez votre système de manière à prendre également en compte la sémantique "distante".

Si votre conception repose sur des méthodes EJB changeant les objets transmis, il serait difficile pour vous de "passer à distance" plus tard; peut-être même impossible.

Bonne chance.

44
répondu Isaac 2010-10-03 04:48:42

Selon la spécification EJB 3.2, un EJB peut être local ou distant. Une interface métier ne peut pas être à la fois locale et distante.

@Local les beans annotés ne sont accessibles que s'ils sont dans la même application.

@Remote les beans annotés sont accessibles à travers différentes applications, résidant dans différentes JVM ou sur des serveurs d'applications.

, Donc les choses importantes à garder à l'esprit sont:

  1. Si une classe bean contient l'annotation @Remote, alors toutes les interfaces implémentées doivent être distantes.
  2. Si une classe bean ne contient aucune annotation ou si l'annotation @Local est spécifiée, toutes les interfaces implémentées sont supposées être locales.
  3. toutes les interfaces qui sont explicitement définies pour un bean qui ne contient aucune interface doivent être déclarées comme @Local.
  4. la version EJB 3.2 tend à fournir plus de granularité pour les situations où les interfaces locales et distantes doivent être explicitement définies.
14
répondu Pritam Banerjee 2016-12-11 11:24:12

Cela peut répondre à vos préoccupations :

Généralement, votre Bean Java D'entreprise aura besoin d'une vue client distante dans cas où vous prévoyez d'utiliser le bean dans des environnements distribués. Plus précisément, ce sont les cas où le client va travailler avec elle sera dans une machine virtuelle Java différente (JVM). Dans le cas d'une vue client distante, appelant n'importe quelle méthode depuis la maison distante l'interface et / ou l'interface de composant distant seront manipulées par l'intermédiaire de la distance méthode invocation (RMI).

Un EJB ne peut utiliser la vue client locale que s'il est vraiment garanti que d'autres beans d'entreprise ou clients ne s'adresseront au bean que dans un JVM unique. Si tel est le cas, cet accès sera effectué avec appels de méthode directe, au lieu de RMI.

Source: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

7
répondu Abdulaziz 2013-11-11 00:42:40