Enlace de sirviente

Se describen los pasos necesarios para enlazar el sirviente.

La implementación del servidor es necesaria para realizar las tareas siguientes:
  1. Crear una instancia de ORB; es decir, ORB.init(...)
  2. Crear una instancia de sirviente; es decir, nuevo SampleImpl(...)
  3. Crear una instancia de Tie a partir de la instancia de sirviente; es decir, Util.getTie(...)
  4. Exportar el sirviente enlazándolo a un servicio de nombres
Tal como se describe para el lado del cliente, debe crear la instancia de ORB llamando al método estático de ORB init(...). Los pasos típicos que realiza el método init(...) son:
  1. Recuperar propiedades
  2. Obtener el cargador de clases del sistema
  3. Cargar y crear una instancia de la clase ORB según se ha especificado en la propiedad ORBClass
  4. Inicializar el ORB según lo determinado por las propiedades

A continuación, el servidor debe crear una instancia de la clase de sirviente SampleImpl.class. Pero de hecho sucede algo más que la creación de una instancia de una clase. Recuerde que el sirviente SampleImpl amplía la clase PortableRemoteObject; por consiguiente, se invoca el constructor de PortableRemoteObject. Este constructor llama al método estático exportObject(...) con el parámetro que es la misma instancia de sirviente que intenta instanciar. Si el sirviente no hereda de PortableRemoteObject, la aplicación debe llamar directamente a exportObject().

Primero, el método exportObject() intenta cargar un vínculo RMI-IIOP. El ORB implementa una memoria caché de clases de vínculos para mejorar el rendimiento. Si la clase de vínculo aún no se ha almacenado en memoria caché, carga una clase de vínculo del sirviente. Si no encuentra ninguna, sube por el árbol de herencia intentando cargar los vínculos de la clase padre. El ORB se detiene si encuentra una clase PortableRemoteObject o java.lang.Object y devuelve un valor null. De lo contrario, devuelve una instancia de ese vínculo de una tabla hash que empareja un vínculo con el sirviente. Si el ORB no puede encontrar el vínculo, presupone que tal vez exista un esqueleto RMI (JRMP) y llama al método exportObject() de la clase UnicastRemoteObject. Se registra un vínculo null en la memoria caché y se emite una excepción. Ahora el sirviente está preparado para recibir invocaciones de métodos remotos. Sin embargo, aún no es accesible.

En el próximo paso, el código de servidor debe encontrar el propio vínculo (suponiendo que el intermediario de solicitudes de objetos (ORB) ya lo haya obtenido) para poderlo exportar a un servicio de nombres. Para ello, el servidor pasa la instancia que se acaba de crear del servicio al método estático javax.rmi.CORBA.Util.getTie(). Este método, a su vez, obtiene el vínculo que está en la tabla hash que el ORB ha creado. El vínculo contiene el par de las clases de vínculo-sirviente.

Cuando está en posesión del vínculo, el servidor debe obtener una referencia del servicio de nombres y enlazar el enlace a ella. Como en el lado del cliente, el servidor llama al método de ORB resolve_initial_references("NameService"). A continuación, el servidor crea un NameComponent, que es un objeto de árbol de directorio que identifica la vía de acceso y el nombre de la referencia de objeto remoto en el servicio de nombres. El servidor enlaza NameComponent junto con el enlace. A continuación, el servicio de nombres pone el IOR a disposición para todos los que lo soliciten. Durante este proceso, el código de servicio envía un LocateRequest para obtener la dirección de servidor de nombres. También envía una solicitud que requiere una operación de volver a enlazar con el servidor de nombres.