Conversión de los programas RMI para que utilicen IIOP
Guía general para convertir una aplicación RMI para que utilice RMI-IIOP.
Antes de empezar
Procedimiento
- Si utiliza el registro de RMI para los servicios de nombres, debe cambiar a CosNaming:
- Tanto en el código cliente como en el código servidor, debe crear un InitialContext
para JNDI.Para una aplicación Java™ utilice el código siguiente:
import javax.naming.*; ... Context ic = new InitialContext();Para un applet, utilice este código alternativo:import java.util.*; import javax.naming.*; ... Hashtable env = new Hashtable(); env.put("java.naming.applet", this); Context ic = new InitialContext(env); - Modifique todos los usos del registro RMI lookup(), bind()y rebind() para utilizar JNDI lookup(), bind()y rebind() en su lugar.En lugar de:
use:import java.rmi.*; ... Naming.rebind("MyObject", myObj);import javax.naming.*; ... ic.rebind("MyObject", myObj);
- Tanto en el código cliente como en el código servidor, debe crear un InitialContext
para JNDI.
- Si no utiliza el registro de RMI para los servicios de nombres, debe haber alguna otra forma de ejecutar bootstrap a la referencia de objeto remoto inicial. Por ejemplo, el código de servidor puede estar utilizando la serialización Java para escribir una referencia de objeto RMI en un ObjectOutputStream y pasarlo al código de cliente para deserializarlo en un apéndice RMI. Al hacerlo en
RMI-IIOP, también debe asegurarse de que las referencias de objetos están conectadas a un intermediario de solicitudes de objetos (ORB) antes de la serialización y después de la deserialización.
- En el lado del servidor, utilice la llamada PortableRemoteObject.toStub() para obtener un apéndice y, a continuación, utilice writeObject() para serializar este apéndice en un ObjectOutputStream. Si es necesario, utilice Stub.connect() para conectar el apéndice a un ORB antes de serializarlo.Por ejemplo:
org.omg.CORBA.ORB myORB = org.omg.CORBA.ORB.init(new String[0], null); Wombat myWombat = new WombatImpl(); javax.rmi.CORBA.Stub myStub = (javax.rmi.CORBA.Stub)PortableRemoteObject.toStub(myWombat); myStub.connect(myORB); // myWombat is now connected to myORB. To connect other objects to the // same ORB, use PortableRemoteObject.connect(nextWombat, myWombat); FileOutputStream myFile = new FileOutputStream("t.tmp"); ObjectOutputStream myStream = new ObjectOutputStream(myFile); myStream.writeObject(myStub); - En el lado del cliente, utilice readObject() para deserializar una referencia remota al objeto desde un ObjectInputStream. Antes de utilizar el apéndice deserializado para llamar a métodos remotos, debe estar conectado a un intermediario de solicitudes de objetos (ORB).Por ejemplo:
FileInputStream myFile = new FileInputStream("t.tmp"); ObjectInputStream myStream = new ObjectInputStream(myFile); Wombat myWombat = (Wombat)myStream.readObject(); org.omg.CORBA.ORB myORB = org.omg.CORBA.ORB.init(new String[0], null); ((javax.rmi.CORBA.Stub)myWombat).connect(myORB); // myWombat is now connected to myORB. To connect other objects to the // same ORB, use PortableRemoteObject.connect(nextWombat, myWombat);
El enfoque JNDI es mucho más sencillo, por lo tanto es preferible utilizarlo siempre que sea posible. - En el lado del servidor, utilice la llamada PortableRemoteObject.toStub() para obtener un apéndice y, a continuación, utilice writeObject() para serializar este apéndice en un ObjectOutputStream. Si es necesario, utilice Stub.connect() para conectar el apéndice a un ORB antes de serializarlo.
- Cambie las clases de implementación remota para que hereden de javax.rmi.PortableRemoteObjecto, explícitamente, para exportar objetos de implementación después de la creación llamando a PortableRemoteObject.exportObject(). Para obtener más información sobre este tema, consulte Conexión de apéndices IIOP al ORB.
- Cambie todos los lugares del código en los que haya una conversión Java de una interfaz remota para utilizar javax.rmi.PortableRemoteObject.narrow().
- No dependa de la recopilación de basura distribuida (DGC) ni utilice los recursos DGC de RMI. Utilice PortableRemoteObject.unexportObject() para hacer que el ORB libere sus referencias a un objeto exportado que ya no esté en uso.
- Regenerar los apéndices y empates de RMI utilizando el mandato rmic con la opción -iiop .Se generarán archivos de apéndices y vínculo son los nombres siguientes:_<implementationName>_Tie.class
_<interfaceName>_Stub.class - Antes de iniciar el servidor, inicie el servidor CosNaming (en su propio proceso) utilizando el mandato tnameservEl servidor CosNaming utiliza el número de puerto predeterminando de 2809. Si desea utilizar un número de puerto distinto, utilice el parámetro -ORBInitialPort.
- Al iniciar las aplicaciones cliente y servidor, debe especificar algunas propiedades del sistema.Al ejecutar una aplicación, puede especificar las propiedades en la línea de mandatos:
java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://<hostname>:2809 <appl_class> - Si el cliente es un applet, debe especificar algunas propiedades en el código applet.Por ejemplo:
Este ejemplo utiliza el número de puerto de servicio de nombre predeterminado de 2809. Si especifica un puerto diferente en el paso anterior, es necesario utilizar el mismo número de puerto en el URL del proveedor especificado aquí.java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory java.naming.provider.url=iiop://<hostname>:2809El <hostname> en el URL del proveedor es el nombre de host que se ha utilizado para iniciar el servidor CosNaming.