RMI (Remote Method invocation)
RMI (Remote Method invocation) es una API que proporciona un mecanismo para crear aplicaciones distribuidas en java. El RMI permite que un objeto invoque métodos en un objeto que se ejecuta en otra JVM.
El RMI proporciona comunicación remota entre las aplicaciones mediante dos objetos stub y skeleton.
Comprender el stub y el esqueleto
RMI utiliza el stub y el objeto esqueleto para comunicarse con el objeto remoto.
Un objeto remoto es un objeto cuyo método se puede invocar desde otra JVM. Entendamos los objetos stub y esqueleto:
stub
El stub es un objeto, actúa como una puerta de enlace para el lado del cliente. Todas las solicitudes salientes se enrutan a través de él. Reside en el lado del cliente y representa el objeto remoto. Cuando el llamador invoca el método en el objeto stub, realiza las siguientes tareas:
- Inicia una conexión con una Máquina Virtual remota (JVM),
- Escribe y transmite (marshals) los parámetros a la Máquina Virtual remota (JVM),
- Espera el resultado
- Lee (desmarca) el valor de retorno o excepción, y
- Finalmente, devuelve el valor valor para la persona que llama.
esqueleto
El esqueleto es un objeto, actúa como una puerta de enlace para el objeto del lado del servidor. Todas las solicitudes entrantes se enrutan a través de él. Cuando el esqueleto recibe la solicitud entrante, realiza las siguientes tareas:
- Lee el parámetro para el método remoto
- Invoca el método en el objeto remoto real, y
- Escribe y transmite (marshals) el resultado al llamante.
En el SDK de Java 2, se introdujo un protocolo stub que elimina la necesidad de esqueletos.
Descripción de los requisitos para las aplicaciones distribuidas
Si alguna aplicación realiza estas tareas, puede ser aplicación distribuida.
.
- La aplicación necesita localizar el método remoto
- Necesita proporcionar la comunicación con los objetos remotos, y
- La aplicación necesita cargar las definiciones de clase para los objetos.
La aplicación RMI tiene todas estas características, por lo que se llama aplicación distribuida.
Ejemplo de Java RMI
Se dan los 6 pasos para escribir el programa RMI.
- Crear la interfaz remota
- Proporcionar la implementación de la interfaz remota
- Compilar la clase de implementación y crear los objetos stub y esqueleto utilizando la herramienta rmic
- Iniciar el servicio de registro mediante la herramienta rmiregistry
- Crear e iniciar la aplicación remota
- aplicación cliente
Ejemplo de RMI
En este ejemplo, hemos seguido los 6 pasos para crear y ejecutar la aplicación de rmi. La aplicación cliente solo necesita dos archivos, interfaz remota y aplicación cliente. En la aplicación rmi, tanto el cliente como el servidor interactúan con la interfaz remota. La aplicación cliente invoca métodos en el objeto proxy, RMI envía la solicitud a la JVM remota. El valor devuelto se devuelve al objeto proxy y, a continuación, a la aplicación cliente.
1) cree la interfaz remota
Para crear la interfaz remota, extienda la interfaz remota y declare la excepción remota con todos los métodos de la interfaz remota. Aquí, estamos creando una interfaz remota que amplía la interfaz remota. Solo hay un método llamado add() y declara RemoteException.
2) Proporcionar la implementación de la interfaz remota
Ahora proporcionar la implementación de la interfaz remota. Para proporcionar la implementación de la interfaz remota, necesitamos
- Extender la clase UnicastRemoteObject,
- o usar el método exportObject () de la clase UnicastRemoteObject
En caso de que extienda la clase UnicastRemoteObject, debe definir un constructor que declare RemoteException.
3) cree los objetos stub y esqueleto utilizando la herramienta rmic.
El siguiente paso es crear objetos stub y esqueleto utilizando el compilador rmi. La herramienta rmic invoca el compilador de RMI y crea objetos stub y esqueleto.
4)Inicie el servicio de registro con la herramienta rmiregistry
Ahora inicie el servicio de registro con la herramienta rmiregistry. Si no especifica el número de puerto, utiliza un número de puerto predeterminado. En este ejemplo, estamos utilizando el número de puerto 5000.
5) Cree y ejecute la aplicación de servidor
Ahora los servicios rmi deben hospedarse en un proceso de servidor. La clase Naming proporciona métodos para obtener y almacenar el objeto remoto. La clase de nomenclatura proporciona 5 métodos.
java estático público.rmi.Búsqueda remota(java.lang.String) lanza java.rmi.NotBoundException, java. net. MalformedURLException, java.rmi.RemoteException; | Devuelve la referencia del objeto remoto. |
enlace vacío estático público (java.lang.String, java.rmi.Remoto) lanza java.rmi.Ya hay una excepción de límite, java.net.Excepción malformada, java.rmi.Excepción remota; | Enlaza el objeto remoto con el nombre dado. |
desvinculación del vacío estático público (java.lang.String) lanza java.rmi.Excepción remota, java.rmi.NotBoundException, java.net.MalformedURLException; | destruye el objeto remoto que está enlazado con el nombre dado. |
rebind de vacío estático público (java.lang.String, java.rmi.Remoto) lanza java.rmi.RemoteException, java. net. MalformedURLException; | Enlaza el objeto remoto con el nuevo nombre. |
java estático público.lang.Lista de cadenas (java.lang.String) lanza java.rmi.RemoteException, java.net.MalformedURLException; | devuelve un array con los nombres de los objetos remotos atado en el registro. |
En este ejemplo, vinculamos el objeto remoto con el nombre sonoo.
6) Crear y ejecutar la aplicación cliente
En el cliente, obtenemos el objeto stub mediante el método lookup() de la clase Naming e invocamos el método en este objeto. En este ejemplo, estamos ejecutando las aplicaciones de servidor y cliente, en la misma máquina, por lo que estamos usando localhost. Si desea acceder al objeto remoto desde otra máquina, cambie el host local al nombre de host (o dirección IP) donde se encuentra el objeto remoto.
Salida de este ejemplo de RMI
Ejemplo significativo de aplicación de RMI con base de datos
Considere un escenario, hay dos aplicaciones que se ejecutan en máquinas diferentes. Digamos que MachineA y Máquinab, machineA se encuentra en Estados unidos y Máquinab en la India. Máquinab desea obtener la lista de todos los clientes de MachineA aplicación.
Desarrollemos la aplicación RMI siguiendo los pasos.
1) Crear la tabla
En primer lugar, necesitamos crear la tabla en la base de datos. Aquí, estamos utilizando la base de datos Oracle10.
2) Crear clase de cliente e interfaz remota
Archivo: Cliente.java
Nota: La clase Cliente debe ser serializable.
Archivo: Banco.java
3) Cree la clase que proporciona la implementación de Interfaz remota
File: BankImpl.java
4) Compilar la herramienta de clase rmic e iniciar el servicio de registro mediante la herramienta rmiregistry
5) Crear y ejecutar el servidor
File: MyServer.java
6) Cree y ejecute el archivo Cliente
: MyClient.java