3.2.9. Changements Invocations à distance

3.2.9.1. Migrer des Applications dépoyées dans JBoss Enterprise Application Platform 5 qui font des invocations dans JBoss Enterprise Application Platform 6

Résumé

Dans JBoss Enterprise Application Platform 6, il y a deux façons de faire des invocations au serveur :

  • Vous pouvez utiliser le nouvel API client EJB spécial JBoss pour faire l'invocation.
  • Vous pouvez utiliser JNDI pour chercher un proxy pour votre bean et l'invoquer sur ce proxy renvoyé.
Cette section couvre l'option 2: changements de codification requis pour les clients qui utilisent JNDI.

Dans JBoss Enterprise Application Platform 5, l'interface distante EJB était liée dans JNDI, par défaut, sous le nom "ejbName/local" pour les interfaces locales, et "ejbName/remote" pour les interfaces éloignées. L'application client consulte ensuite le bean qui utilise "ejbName/remote".
Dans JBoss Enterprise Application Platform 6, vous pouvez utiliser ejb:NAMESPACE_NAME pour l'accès éloigné aux EJB avec la syntaxe suivante : Pour les beans stateless :
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>

Pour les beans stateful :
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful

Les valeurs à substituer dans la syntaxe ci-dessus sont :
  • <app-name> - le nom de l'application des EJB déployés. C'est généralement le nom de l'ear sans le suffixe .ear. Cependant, le nom peut être substitué dans le fichier application.xml. Si l'application n'est pas déployée comme un .ear, cette valeur correspondra à une chaîne vide. Assumons que cet exemple n'était pas déployé en tant qu'EAR.
  • <module-name> - le nom du module des EJB déployés sur le serveur. Il s'agit normalement du nom du jar du déploiement EJB, sans le suffixe .jar, mais il peut être remplacé par ejb-jar.xml. Dans cet exemple, on assume que les EJB sont déployés dans jboss-as-ejb-remote-app.jar, donc le nom du module est jboss-as-ejb-remote-app.
  • <distinct-name> - un nom d'EJB distinct, en option. Cet exemple n'utilise pas un nom distinct, mais un string vide.
  • <bean-name> - correspond par défaut au nom de simple classe d'implémentation du bean.
  • <fully-qualified-classname-of-the-remote-interface> - le nom de classe complet de la vue distante.
Mise à jour du code client

Assumons que vous ayez déployé l'EJB stateless suivant dans un serveur JBoss Enterprise Application 6. Notez qu'il expose une vue distante du bean :

@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator {
 
    @Override
    public int add(int a, int b) {
        return a + b;
    }
 
    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}
Dans JBoss Enterprise Application Platform 5, l'invocation et la recherche EJB sont codées de la façon suivante :
InitialContext ctx = new InitialContext();
RemoteCalculator calculator = (RemoteCalculator) ctx.lookup("CalculatorBean/remote");
int a = 204;
int b = 340;
int sum = calculator.add(a, b);
Dans JBoss Enterprise Application Platform 6, à partir des informations ci-dessus, l'invocation et la recherche sont codées ainsi :
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "jboss-as-ejb-remote-app";
final String distinctName = "";
final String beanName = CalculatorBean.class.getSimpleName();
final String viewClassName = RemoteCalculator.class.getName();
final RemoteCalculator statelessRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
 
int a = 204;
int b = 340;
int sum = statelessRemoteCalculator.add(a, b);
Si votre client accède à un EJB stateful, vous devrez ajouter «?stateful» à la fin de la recherche contexte, comme suit :
final RemoteCalculator statefulRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")

Pour trouver un exemple, qui comprend à la fois le cide client et le code serveur, regarder dans Quickstarts, à Modules dans le chapitre Guide de démarrage de Quickstart (Get Started Developing Applications) dans le Guide de développement de JBoss Enterprise Application Platform 6 (Development Guide) à https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ pour la manière de procéder.
Pour obtenir des informations supplémentaires sur les invocations à distance par JNDI, voir le chapitre Invoke a Session Bean Remotely using JNDI du chapitre intitulé Enterprise JavaBeans dans le Development Guide (Guide de développement) de JBoss Enterprise Application Platform 6 https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.