Code du serveur

L'application serveur doit créer une instance de l'objet distant et le publier dans un service de noms. L'interface JNDI (Java™ Naming and Directory Interface) définit un ensemble d'interfaces standard. Les interfaces sont utilisées pour interroger un service de noms ou pour lier un objet au service.

L'implémentation du service de noms peut être un service CosNaming dans l'environnement CORBA (Common Object Request Broker Architecture). Un service CosNaming est une collection de services de noms. Il est implémenté sous la forme d'un ensemble d'interfaces définies par CORBA. Le service de noms peut aussi être implémenté à l'aide d'un registre RMI (Remote Method Invocation) pour une application RMI (JRMP). Vous pouvez utiliser JNDI dans des cas CORBA et RMI. L'objectif est de rendre l'implémentation du serveur indépendante du service de noms utilisé. Par exemple, vous pouvez utiliser le code suivant pour obtenir un service et y lier une référence d'objet :
Context ctx = new InitialContext(...); 	// get hold of the initial context 
ctx.bind("sample", sampleReference);		// bind the reference to the name "sample"	 	
Object obj = ctx.lookup("sample");		// obtain the reference
Pour indiquer à l'application quelle implémentation de nommage est utilisée, vous devez définir l'une des propriétés Java suivantes:
java.naming.factory.initial
Défini également comme javax.naming.Context.INITIAL_CONTEXT_FACTORY. Cette propriété spécifie le nom de classe de la fabrique de contextes initiale du fournisseur de service de noms. Pour le registre RMI, le nom de classe est com.sun.jndi.rmi.registry.RegistryContextFactory. Pour le service CosNaming , le nom de classe est com.sun.jndi.cosnaming.CNCtxFactory.
java.naming.provider.url
Cette propriété configure le contexte d'affectation de nom racine, l'ORB (Object Request Broker) ou les deux. Elle est utilisée lorsque le service de noms est stocké dans un hôte différent et elle peut prendre plusieurs schémas URI :
  • interface du gestionnaire de ressources
  • corbaname
  • corbaloc
  • Interoperable Object Reference
  • iiop
  • iiopname
Par exemple :
rmi://[<host>[:<port>]][/<initial_context>] for RMI registry    
iiop://[<host>[:<port>]][/<cosnaming_name>] for COSNaming
Pour obtenir les propriétés précédentes dans l'environnement, vous pouvez coder :
Hashtable env = new Hashtable(); 	
Env.put(Context.INITIAL_CONTEXT_FACTORY, 		
       "com.sun.jndi.cosnaming.CNCtxFactory");
et envoyer la table de hachage comme argument au constructeur InitialContext.

Par exemple, avec RMI(JRMP), il suffit de créer une instance du servant et suivre les étapes précédentes pour lier cette référence dans le service de noms.

Toutefois, avec CORBA (Java IDL), vous devez effectuer un travail supplémentaire car vous devez créer un ORB. L'ORB doit rendre la référence de serviteur disponible pour les appels distants. Ce mécanisme est généralement contrôlé par l'adaptateur d'objet de l'ORB.
public class Server {
	public static void main (String args []) {
		try {
			ORB orb = ORB.init(args, null);
			
			// Get reference to the root poa & activate the POAManager 
			POA poa = (POA)orb.resolve_initial_references("RootPOA"); 
			poa.the_POAManager().activate(); 
			
			// Create a servant and register with the ORB
			SampleImpl sample = new SampleImpl();			
			sample.setORB(orb); 

			// TIE model ONLY
			// create a tie, with servant being the delegate and
			// obtain the reference ref for the tie
			SamplePOATie tie = new SamplePOATie(sample, poa); 
			Sample ref = tie._this(orb);

			// Inheritance model ONLY
			// get object reference from the servant 
			org.omg.CORBA.Object ref = poa.servant_to_reference(sample);
      Sample ref = SampleHelper.narrow(ref);

			// bind the object reference ref to the naming service using JNDI
	   		..........(see previous code) .....
			orb.run();
		}
		catch(Exception e) {}
	}
}
Pour RMI-IIOP :
public class Server {
	public static void main (String args []) {
		try {
			ORB orb = ORB.init(args, null);
			
			// Get reference to the root poa & activate the POAManager 
			POA poa = (POA)orb.resolve_initial_references("RootPOA"); 
			poa.the_POAManager().activate();

			// Create servant and its tie
			SampleImpl sample = new SampleImpl();
			_SampleImpl_Tie tie = (_SampleImpl_Tie)Util.getTie(sample); 
			
			// get an usable object reference 
			org.omg.CORBA.Object ref = poa.servant_to_reference((Servant)tie);

			// bind the object reference ref to the naming service using JNDI
	   		..........(see previous code) .....
		}
		catch(Exception e) {}
	}
}

Pour utiliser le code de serveur POA (Portable Object Adapter) précédent, vous devez utiliser les options -iiop -poa ensemble pour permettre à rmic de générer le lien. Si vous n'utilisez pas le POA, le code de serveur RMI(IIOP) peut se réduire à instancier le servant (SampleImpl sample = new SampleImpl()). Vous liez ensuite le servant à un service de nommage comme c'est généralement le cas dans l'environnement RMI (JRMP). Dans ce cas, vous devez utiliser uniquement l'option -iiop pour permettre à rmic de générer le lien RMI-IIOP. Si vous omettez -iiop, le squelette RMI(JRMP) est généré.

Lorsque vous exportez un objet RMI-IIOP sur le serveur, vous n'avez pas nécessairement à choisir entre JRMP et IIOP. Si vous avez besoins d'un seul objet serveur pour prendre en charge les clients JRMP et IIOP, vous pouvez exporter l'objet RMI-IIOP vers JRMP et IIOP simultanément. Dans la terminologie RMI-IIOP, cette action s'appelle une exportation double.

Exemple de client RMI :
public class SampleClient { 	 
  public static void main(String [] args) {  	    
    try{ 			 		
      Sample sampleref
      //Look-up the naming service using JNDI and get the reference 			
            ......... 		
      // Invoke method   		
      System.out.println(sampleRef.message()); 	    
    } 	    
    catch(Exception e) {} 	  
  } 	
}  
Exemple de client CORBA :
public class SampleClient {
	public static void main (String [] args) {
		try {
			ORB orb = ORB.init(args, null);
			// Look up the naming service using JNDI
			......
			// Narrowing the reference to the correct class
			Sample sampleRef = SampleHelper.narrow(o);
			// Method Invocation
			System.out.println(sampleRef.message());
		}
		catch(Exception e) {}
	}
}
Exemple de client RMI-IIOP :
public class SampleClient {
	public static void main (String [] args) {
		try{
			ORB orb = ORB.init(args, null);
			// Retrieving reference from naming service
			........
			// Narrowing the reference to the correct class
			Sample sampleRef = (Sample)PortableRemoteObject.narrow(o, Sample.class);
			// Method Invocation
			System.out.println(sampleRef.message());
		}
		catch(Exception e) {}
	}
}