Exemple : Obtention d'un contexte initial avec CosNaming
Dans WebSphere Application Server, un contexte initial est obtenu à partir d'un serveur d'amorce. L'adresse de ce dernier se compose de l'hôte et du port. Pour obtenir un contexte initial, vous devez connaître l'hôte et le port du serveur utilisé comme serveur d'amorce.
L'obtention d'un contexte initial comporte deux étapes de base :
- Obtention d'une référence ORB.
- Utilisation d'une référence ORB pour obtenir un contexte initial. Vous pouvez également utiliser une fonction ORB existante et invoquer string_to_object avec une URL d'objet CORBA et plusieurs adresses de serveurs de noms pour obtenir un contexte initial.
Obtention d'une référence ORB
Les clients CosNaming purs, c'est-à-dire ceux qui ne s'exécutent pas dans un processus serveur, doivent créer et initialiser une instance ORB à l'aide de laquelle le contexte initial sera obtenu. Les clients CosNaming exécutés dans des processus serveur peuvent obtenir une référence à l'ORB de serveur avec une recherche JNDI. Les exemples suivants illustrent la création et l'initialisation d'un client ORB et expliquent comment obtenir une référence ORB de serveur.
Création d'une instance ORB de client
Pour créer une instance ORB, appelez la méthode statique org.omg.CORBA.ORB.init. La méthode init nécessite qu'une propriété soit définie sur le nom de la classe ORB à instancier. Une mise en oeuvre ORB avec le nom de classe com.ibm.CORBA.iiop.ORB est incluse dans le produit. L'ORB WebSphere Application Server reconnaît les propriétés supplémentaires avec lesquelles vous pouvez spécifier des références initiales.
Les étapes de base pour créer un ORB sont les suivantes :
- Création d'un objet Propriétés.
- Paramétrage de la propriété de classe ORB sur la classe ORB du produit.
- Paramétrage des propriétés de référence initiales.
- Appel d'ORB.init, transmission de l'objet Propriétés.
![[AIX]](../images/aixlogo.gif)
![[HP-UX]](../images/hpux.gif)
![[Linux]](../images/linux.gif)
![[Solaris]](../images/solaris.gif)
![[Windows]](../images/windows.gif)
...
import java.util.Properties;
import org.omg.CORBA.ORB;
...
Properties props = new Properties();
props.put("org.omg.CORBA.ORBClass", "com.ibm.CORBA.iiop.ORB");
props.put("com.ibm.CORBA.ORBInitRef.NameService",
"corbaloc:iiop:myhost.mycompany.com:2809/NameService");
props.put("com.ibm.CORBA.ORBInitRef.NameServiceServerRoot",
"corbaloc:iiop:myhost.mycompany.com:2809/NameServiceServerRoot");
ORB _orb = ORB.init((String[])null, props);
...
![[z/OS]](../images/ngzos.gif)
...
import java.util.Properties;
import org.omg.CORBA.ORB;
...
Properties props = new Properties();
props.put("org.omg.CORBA.ORBClass","com.ibm.ws390.orb.ORB");
props.put("com.ibm.CORBA.ORBInitRef.NameService",
"corbaloc:iiop:myhost.mycompany.com:2809/NameService");
props.put("com.ibm.CORBA.ORBInitRef.NameServiceServerRoot",
"corbaloc:iiop:myhost.mycompany.com:2809/NameServiceServerRoot");
ORB _orb = ORB.init((String[])null, props);
...
![[IBM i]](../images/iseries.gif)
...
import java.util.Properties;
import org.omg.CORBA.ORB;
...
Properties props = new Properties();
props.put("org.omg.CORBA.ORBClass","com.ibm.ws390.orb.ORB");
props.put("com.ibm.CORBA.ORBInitRef.NameService",
"corbaloc:iiop:myhost.mycompany.com:2809/NameService");
props.put("com.ibm.CORBA.ORBInitRef.NameServiceServerRoot",
"corbaloc:iiop:myhost.mycompany.com:2809/NameServiceServerRoot");
ORB _orb = ORB.init((String[])null, props);
...
Obtention d'une référence à l'ORB de serveur
Les clients CosNaming exécutés dans un processus serveur peuvent obtenir une référence à l'ORB de serveur à l'aide d'une recherche JNDI sur un nom java:, comme indiqué ci-dessous :
...
import javax.naming.Context;
import javax.naming.InitialContext;
import org.omg.CORBA.ORB;
...
Context initialContext = new InitialContext();
ORB orb = (ORB) initialContext.lookup("java:comp/ORB");
...
Utilisation d'une référence ORB pour obtenir une référence de nommage initiale
Il existe deux approches de base pour obtenir un contexte CosNaming initial. Toutes deux impliquent un appel de méthode ORB. La première consiste à appeler la méthode resolve_initial_references sur l'ORB avec une clé de référence initiale. Pour que cet appel ait lieu, l'ORB doit être initialisé avec une référence initiale pour cette clé. L'autre approche consiste à appeler la méthode string_to_object sur l'ORB, en transmettant une URL d'objet CORBA avec l'hôte et le port du serveur d'amorce. Les exemples qui suivent illustrent ces deux approches.
Appel de la méthode resolve_initial_references
Une fois la référence ORB obtenue, appelez la méthode resolve_initial_references sur l'ORB pour obtenir une référence au contexte initial. L'exemple de code suivant appelle resolve_initial_reference sur une référence ORB.
...
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
...
// Obtain ORB reference as shown in examples earlier in this section
...
org.omg.CORBA.Object obj = _orb.resolve_initial_references("NameService");
NamingContextExt initCtx = NamingContextExtHelper.narrow(obj);
...
Notez que la clé NameService est transmise à la méthode resolve_initial_references. D'autres clés de contexte initial sont enregistrées dans les serveurs de produit. Par exemple, NameServiceServerRoot peut être utilisée pour obtenir une référence au contexte racine du serveur dans le serveur de noms d'amorce. Pour plus d'informations concernant les contextes initiaux enregistrés dans les ORB de serveur, voir la rubrique relative à la prise en charge des contextes initiaux.
Appel de string_to_object avec une URL objet CORBA
Vous pouvez utiliser un ORB compatible avec INS pour obtenir un contexte initial, même si l'ORB n'est pas initialisé avec des références initiales ou des propriétés d'amorçage, ou si ces paramètres de propriété sont destinés à un autre serveur que le serveur de noms à partir duquel vous souhaitez obtenir un contexte initial. Pour obtenir un contexte initial en spécifiant explicitement le serveur de noms d'amorce, appelez la méthode string_to_object sur l'ORB en transmettant une URL d'objet CORBA contenant l'hôte et le port du serveur d'amorce.
Dans l'exemple ci-dessous, le code appelle la méthode string_to_object sur une référence ORB existante, en transmettant une URL d'objet CORBA qui identifie le contexte initial souhaité.
...
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
...
// Obtain ORB reference as shown in examples earlier in this section
...
org.omg.CORBA.Object obj =
orb.string_to_object("corbaloc:iiop:myhost.mycompany.com:2809/NameService");
NamingContextExt initCtx = NamingContextExtHelper.narrow(obj);
...
Notez que la clé NameService est utilisée dans l'URL corbaloc. D'autres clés de contexte initial sont enregistrées dans les serveurs de produit. Par exemple, NameServiceServerRoot peut être utilisée pour obtenir une référence au contexte racine du serveur dans le serveur de noms d'amorce.
Utilisation d'un ORB existant et appel de string_to_object avec une URL d'objet CORBA
Les URL d'objet CORBA peuvent contenir plus d'une adresse de serveur d'amorce. Utilisez cette caractéristique lorsque vous tentez d'obtenir un contexte initial d'un cluster de serveurs. Vous pouvez spécifier les adresses de serveur d'amorce pour tous les serveurs du cluster dans l'URL. L'opération réussit si au moins un des serveurs est actif, ce qui limite le nombre d'échecs. Il n'existe par d'ordre particulier pour le traitement de la liste d'adresses. Par exemple, l'adresse du second serveur d'amorce pourrait être utilisée pour obtenir le contexte initial même si le premier serveur d'amorce de la liste est disponible. Voici un exemple d'URL corbaloc avec plusieurs adresses.
...
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
...
// Assume orb is an existing ORB instance
org.omg.CORBA.Object obj = orb.string_to_object(
"corbaloc::myhost1:9810,:myhost1:9811,:myhost2:9810/NameService");
NamingContextExt initCtx = NamingContextExtHelper.narrow(obj);
...