Je suis très nouveau sur Java EE et j'essaie de comprendre le concept d'interfaces locales et d'interfaces distantes. On m'a dit que l'un des gros avantages de Java EE est facile à faire évoluer (ce qui, je pense, signifie que vous pouvez déployer différents composants sur différents serveurs). et utiliser des interfaces locales si votre application ne réside que sur un seul serveur?
Si mes hypothèses ci-dessus sont correctes, comment procéderiez-vous pour choisir d'utiliser des interfaces locales ou distantes pour une nouvelle application, en cas de doute sur le volume du trafic? Commencez par utiliser les interfaces locales et passez progressivement aux interfaces distantes, le cas échéant?
Merci pour toute clarification et suggestions.
Je suis très nouveau dans 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 le seul moyen de les invoquer consistait à effectuer un appel distant en utilisant la sémantique RMI et tout le surcoût qu’elle implique (un appel réseau et une sérialisation des objets pour chaque transaction). appel de méthode). Les clients EJB devaient payer cette pénalité de performance même lorsqu'ils étaient colocalisés dans la même machine virtuelle avec le conteneur EJB.
Par la suite, Sun s’est rendu compte que la plupart des applications commerciales ne distribuaient pas d’EJB à un niveau différent et ont corrigé les spécifications (dans EJB 2.0) en introduisant le concept d’interfaces locales afin que les clients colocalisés dans le même ordinateur virtuel avec le conteneur EJB puissent appeler des EJB à l’aide de invocation directe de méthode, en contournant totalement la sémantique de RMI (et la surcharge associée).
On m'a dit que l'un des gros avantages de Java EE est qu'il est facile à faire évoluer (ce qui signifie que vous pouvez déployer différents composants sur différents serveurs).
Java EE peut évoluer, mais cela ne signifie pas nécessairement la distribution de 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 comporte différents composants sur différents serveurs? Et utilisez les interfaces locales si votre application ne réside que sur un seul serveur?
Je le formulerais ainsi: utilisez des interfaces distantes si le client ne se trouve pas dans la même machine virtuelle (cela ne signifie pas qu’un seul serveur/machine virtuelle) est utilisé.
(...) Commencez par utiliser les interfaces locales et passez progressivement aux interfaces distantes, le cas échéant?
Je commencerais probablement par utiliser des interfaces locales. Et comme déjà indiqué, le passage aux interfaces distantes n’est pas toujours obligatoire (vous pouvez mettre en cluster une structure co-localisé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).
Bien que je sois d’accord avec la plupart de ce qui est écrit ci-dessus, j’aimerais affiner un peu les idées sur la façon de commencer.
Ma suggestion est de ne jamais jamais programmer directement aux interfaces EJB dans votre code. Utilisez toujours une interface régulière orientée métier, programmez-la (c’est-à-dire que vous avez vos méthodes d’appel de code sur l’interface orientée métier) et fournissez le code "collé" de l’EJB en tant qu’implémentation enfichable. Votre programme doit être axé sur la logique métier et non sur les détails de la mise en œuvre tels que EJB.
De cette façon, vous pouvez facilement basculer entre des 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.
Remarque spéciale sur le passage de local à 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 des arguments valeur par valeur, alors que l'appel via l'interface "interface locale" entraîne la transmission des arguments par référence. C'est une différence majeure; Par conséquent, si vous "commencez par local", veillez à concevoir votre système de manière à prendre en compte la sémantique "distante".
Si votre conception repose sur des méthodes EJB modifiant les objets transmis, il serait alors difficile pour vous de "passer en mode distant" ultérieurement; peut-être même impossible.
Bonne chance.
Selon la spécification EJB 3.2, un EJB peut être soit 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 à travers différentes applications, résidant dans différents JVM ou sur différents serveurs d’application.
Donc, les choses importantes à garder à l’esprit sont:
@Remote
annotation, toutes les interfaces implémentées doivent être distantes.@Local
annotation est spécifiée, toutes les interfaces implémentées sont supposées être locales.Cela peut répondre à vos préoccupations:
En règle générale, votre entreprise Java Bean nécessitera une vue de client distant lorsque vous envisagez d'utiliser le bean dans des environnements distribués. Plus précisément, il s'agit des cas où le client avec lequel il travaillera être dans une autre Java machine virtuelle (JVM). Dans le cas d'une vue client distante, l'appel d'une méthode à partir de l'interface home distante et/ou de l'interface du composant distant sera gérée via l'appel de méthode à distance (RMI).
Un EJB peut utiliser la vue client local uniquement s'il est vraiment garanti que d'autres beans ou clients d'entreprise ne l'adresseront qu'au sein d'une seule machine virtuelle. Si tel est le cas, cet accès sera effectué avec des appels de méthode directs, au lieu de RMI.
Source: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text