Código de servidor

La aplicación de servidor tiene que crear una instancia del objeto remoto y publicarla en un servicio de nombres. JNDI (Java™ Naming and Directory Interface) define un conjunto de interfaces estándar. Las interfaces se utilizan para consultar un servicio de nombres o para enlazar un objeto a ese servicio.

La implementación del servicio de denominación puede ser un servicio CosNaming en el entorno CORBA (Common Object Request Broker Architecture). Un servicio CosNaming es una colección de servicios de nombres que se implementa como un conjunto de interfaces definidas por CORBA. Como alternativa, el servicio de nombres puede implementarse utilizando un registro RMI (invocación del método remoto) para una aplicación RMI(JRMP). Puede utilizar JNDI en CORBA y en los casos RMI. El efecto es conseguir que la implementación del servidor sea independiente del servicio de nombres que se utiliza. Por ejemplo, podría utilizar el código siguiente para obtener un servicio de nombres y enlazar en él una referencia de objeto:
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
Para indicar a la aplicación qué implementación de denominación está en uso, debe establecer una de las siguientes propiedades Java:
java.naming.factory.initial
Definida también como javax.naming.Context.INITIAL_CONTEXT_FACTORY, esta propiedad especifica el nombre de clase de la fábrica de contexto inicial para el proveedor de servicios de denominación. Para el registro RMI, el nombre de clase es com.sun.jndi.rmi.registry.RegistryContextFactory. Para el servicio CosNaming , el nombre de clase es com.sun.jndi.cosnaming.CNCtxFactory.
java.naming.provider.url
Esta propiedad configura el contexto raíz de nombres, el intermediario de solicitudes de objetos (ORB) o ambos. Se utiliza cuando el servicio de nombres se almacena en un host diferente y puede tener varios esquemas de URI:
  • rmi
  • corbaname
  • corbaloc
  • IOR
  • iiop
  • iiopname
Por ejemplo:
rmi://[<host>[:<port>]][/<initial_context>] for RMI registry    
iiop://[<host>[:<port>]][/<cosnaming_name>] for COSNaming
Para obtener las propiedades anteriores en el entorno, podría codificar:
Hashtable env = new Hashtable(); 	
Env.put(Context.INITIAL_CONTEXT_FACTORY, 		
       "com.sun.jndi.cosnaming.CNCtxFactory");
y pasar la tabla hash como argumento al constructor de InitialContext.

Por ejemplo, con RMI(JRMP), cree una instancia del sirviente y siga los pasos anteriores para vincular esta referencia en el servicio de nombres.

Con CORBA (Java IDL), sin embargo, debe realizar algún trabajo adicional porque tiene que crear un ORB. El ORB tiene que poner la referencia del sirviente a disposición de llamadas remotas. Este mecanismo suele estar controlado por el adaptador de objetos del 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) {}
	}
}
Para 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) {}
	}
}

Para utilizar el código de servidor POA (Portable Object Adapter) anterior, debe utilizar las opciones -iiop -poa juntas para habilitar rmic para generar el empate. Si no utiliza el POA, el código del servidor de RMI(IIOP) se puede reducir para crear una instancia del sirviente (SampleImpl sample = new SampleImpl()). A continuación, enlace el sirviente a un servicio de denominación como normalmente se realiza en el entorno RMI (JRMP). En este caso, sólo tiene que utilizar la opción -iiop para habilitar rmic con el fin de generar el vínculo RMI-IIOP. Si omite -iiop, se genera el esqueleto de RMI(JRMP).

Cuando exporta un objeto RMI-IIOP, no tiene necesariamente que elegir entre JRMP e IIOP. Si necesita un único objeto de servidor para dar soporte a clientes JRMP e IIOP, puede exportar el objeto RMI-IIOP a JRMP y a IIOP simultáneamente. En la terminología RMI-IIOP, esta acción se denomina exportación dual.

Ejemplo de cliente 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) {} 	  
  } 	
}  
Ejemplo de cliente 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) {}
	}
}
Ejemplo de cliente 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) {}
	}
}