Je suis très nouveau sur Java EE et j'essaie de comprendre le concept d'interfaces locales et d'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 que cela implique (un appel réseau et une sérialisation d'objets pour chaque appel de méthode). Les clients EJB ont dû payer cette pénalité de performances même lorsqu'ils étaient colocalisés dans la même machine virtuelle avec le conteneur EJB.
Plus tard, Sun a réalisé que la plupart des applications métier ne distribuaient en fait 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 colocalisés dans la même machine virtuelle avec le conteneur EJB puissent appeler des EJB en utilisant invocation directe de méthode, contournant totalement la sémantique RMI (et la surcharge associée).
On m'a dit que l'un des grands avantages de Java EE est qu'il est facile à mettre à l'échelle (ce qui, je pense, signifie que vous pouvez déployer différents composants sur différents serveurs)
Java EE peut évoluer, mais cela ne signifie pas nécessairement distribuer des 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 différents composants sur différents serveurs? Et utiliser les interfaces locales si votre application ne résidera que sur un serveur?
Je le formulerais comme ceci: utilisez 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 les interfaces locales et effectuez une mise à niveau progressive vers les interfaces distantes le cas échéant?
Je commencerais probablement par utiliser les interfaces locales. Et comme déjà indiqué, le passage aux interfaces distantes n'est pas toujours obligatoire (vous pouvez regrouper une structure colocalisée ).
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
It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
Oui, c'est exactement ça.Do you, by chance know of good books on this topic?
Malheureusement, non, je ne connais pas la ressource absolue "ZE", s'il y en a une. J'ai cependant ajouté plus de ressources avec quelques références.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 démarrer».
Je vous suggère de ne jamais programmer directement sur les interfaces EJB dans votre code. Utilisez toujours une interface régulière, orientée métier, programmez-la (c'est-à-dire faites appel à vos méthodes d'appels de code sur l'interface métier) et fournissez le code «glue» EJB comme une implémentation enfichable. Votre programme doit être axé sur la logique métier et non sur les détails d'implémentation tels que l'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 par 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 la transmission d'arguments par valeur, tandis que l'appel via «l'interface locale» entraîne la transmission d'arguments par référence. C'est une différence majeure ; donc si vous "commencez par local", assurez-vous de concevoir votre système de manière à ce qu'il prenne également en compte la sémantique "distante".
Si votre conception repose sur des méthodes EJB changeant les objets transmis, alors il serait difficile pour vous de "passer à distant" plus tard; peut-être même impossible.
Bonne chance.
la source
Selon EJB Spec 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 se trouvent dans la même application.@Remote
Les beans annotés sont accessibles sur différentes applications, résidant dans différents jvms ou sur des serveurs d'applications.Les choses importantes à garder à l'esprit sont donc:
@Remote
annotation, toutes les interfaces implémentées doivent être distantes.@Local
annotation est spécifiée, alors toutes les interfaces implémentées sont supposées être locales.la source
@Local
pour appeler un EJB dans une autre application (JAR, WAR, EAR), mais la même JVM?Cela peut répondre à vos préoccupations:
Source: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
la source