Invocación del método remoto

El cliente mantiene una referencia al objeto remoto que es una instancia de la clase de apéndice. El siguiente paso es llamar al método de esa referencia. El apéndice implementa la interfaz Sample y por consiguiente, contiene el método message() que el cliente ha invocado.

En primer lugar, el código de apéndice determina si la implementación del objeto remoto se encuentra en la misma instancia de ORB. En tal caso, se puede acceder al objeto sin utilizar Internet.

Si la implementación del objeto remoto se encuentra en la misma instancia de ORB, la mejora de rendimiento puede ser significativa porque se realiza una llamada directa a la implementación de objeto. Si no se puede encontrar ningún servicio local, el apéndice solicita primero al ORB que cree una solicitud llamando al método _request(), especificando el nombre del método y si se espera o no una respuesta.

La especificación CORBA impone una capa adicional de indirección entre el código ORB y el apéndice. Esta capa se conoce habitualmente como delegación. CORBA impone la capa utilizando una interfaz denominada Delegate. Esta interfaz especifica una API portable para la implementación específica del proveedor de ORB de los métodos org.omg.CORBA.Object. Cada apéndice contiene un objeto delegar al que se reenvían todas las invocaciones de métodos org.omg.CORBA.Object. La utilización del objeto delegar significa que un apéndice que el ORB genera de un proveedor pueda funcionar con el delegado del ORB de otro proveedor.

Cuando se crea una solicitud, el ORB comprueba primero si la propiedad enableLocateRequest se ha establecido en true, en cuyo caso, se crea una LocateRequest. Los pasos de creación de esta solicitud son como el caso completo Request.

El ORB obtiene el IOR del objeto remoto (el que se recuperó con el servicio de nombres, por ejemplo) y transfiere la información que está contenida en el IOR (objeto Profile) a la capa de transporte.

La capa de transporte utiliza la información que está en el IOR (dirección IP, número de puerto y clave de objeto) para crear una conexión si no existe. El transporte TCP/IP de ORB tiene una implementación de una tabla de conexiones almacenadas en la memoria caché para mejorar los rendimientos porque la creación de una nueva conexión es un proceso que tarda mucho tiempo. La conexión no es un canal de comunicaciones abierto al host del servidor. Sólo un objeto tiene la posibilidad de crear y suministrar un mensaje TCP/IP a una ubicación en Internet. Normalmente, esto implica la creación de un socket Java™ y una hebra de lector que está preparada para interceptar la respuesta del servidor. Se llama al método ORB.connect() como parte de este proceso.

Cuando el ORB tiene la conexión, continúa para crear el mensaje Request. El mensaje contiene la cabecera y el texto de la solicitud. La especificación CORBA 2.3 especifica el formato exacto. La cabecera contiene estos elementos:
  • Dirección IP local
  • Puerto local
  • Dirección IP remota
  • Puerto remoto
  • Tamaño de mensaje
  • Versión del formato de secuencia CORBA
  • Convención de secuencia de bytes
  • Tipos de solicitud
  • ID
Consulte Determinación de problemas de ORB para obtener una descripción detallada y un ejemplo.

El cuerpo de la solicitud contiene varios contextos de servicio y el nombre y los parámetros de la invocación de método. Los parámetros están normalmente serializados.

Un contexto de servicio es un poco de información adicional que el ORB incluye en la solicitud o la respuesta, para añadir otras funciones diversas. CORBA define unos cuantos contextos de servicio, como por ejemplo, los contextos de base de código y servicio de conjunto de códigos. El primero se utiliza para la característica de llamada de retorno que se describe en la especificación CORBA. El segundo contexto se utiliza para especificar la codificación de series.

En el siguiente paso, el apéndice llama a _invoke(). El efecto es ejecutar el método delegate invoke(). El ORB en esta cadena de sucesos llama al método send() de la conexión y graba la solicitud en el almacenamiento intermedio de sockets, a continuación, la desecha. El método delegate invoke() espera a que llegue una respuesta. El subproceso de lectura que se giró durante la creación de la conexión obtiene el mensaje de respuesta, lo procesa y devuelve el objeto correcto.