La invocación de método remoto de Java ( Java RMI ) es una API de Java que realiza la invocación de método remoto , el equivalente orientado a objetos de las llamadas a procedimientos remotos (RPC), con soporte para la transferencia directa de clases Java serializadas y recolección de basura distribuida .
La implementación original depende de los mecanismos de representación de clases de la máquina virtual Java (JVM) y, por lo tanto, solo admite la realización de llamadas de una JVM a otra. El protocolo subyacente a esta implementación exclusiva de Java se conoce como Protocolo de método remoto de Java (JRMP). Para admitir la ejecución de código en un contexto que no sea de JVM, los programadores desarrollaron posteriormente una versión CORBA .
El uso del término RMI puede denotar únicamente la interfaz de programación o puede significar tanto la API como JRMP, IIOP u otra implementación, mientras que el término RMI-IIOP (léase: RMI sobre IIOP ) denota específicamente la interfaz RMI que delega la mayor parte de la funcionalidad a la implementación CORBA de soporte .
La idea básica de Java RMI, el protocolo de recolección de basura distribuida (DGC) y gran parte de la arquitectura subyacente a la implementación original de Sun, provienen de la característica de "objetos de red" de Modula-3 .
Los programadores de la API RMI original generalizaron un poco el código para admitir diferentes implementaciones, como un transporte HTTP . Además, se agregó a CORBA la capacidad de pasar argumentos " por valor " para que fuera compatible con la interfaz RMI. Aun así, las implementaciones RMI-IIOP y JRMP no tienen interfaces completamente idénticas.
La funcionalidad RMI se incluye en el paquete java.rmi
, mientras que la mayor parte de la implementación de Sun se encuentra en el sun.rmi
paquete . Tenga en cuenta que con las versiones de Java anteriores a Java 5.0, los desarrolladores tenían que compilar los fragmentos RMI en un paso de compilación independiente utilizando rmic
. La versión 5.0 de Java y posteriores ya no requieren este paso.
Jini ofrece una versión más avanzada de RMI en Java. Funciona de manera similar, pero proporciona seguridad más avanzada, capacidades de descubrimiento de objetos y otros mecanismos para aplicaciones de objetos distribuidos. [1]
Las siguientes clases implementan un programa cliente-servidor simple que utiliza RMI y muestra un mensaje.
RmiServerIntf
interfazimportar java.rmi.Remote ; importar java.rmi.RemoteException ; Interfaz pública RmiServerIntf extiende Remote { String getMessage () lanza RemoteException ; }
RmiServer
claseimportar java.rmi.Naming ; importar java.rmi.RemoteException ; importar java.rmi.server.UnicastRemoteObject ; importar java.rmi.registry.* ; clase pública RmiServer extiende UnicastRemoteObject implementa RmiServerIntf { pública estática final String MENSAJE = "Hola mundo" ; public RmiServer () lanza RemoteException { super ( 0 ); // necesario para evitar el paso 'rmic', ver más abajo } public String getMessage () { devolver MENSAJE ; } public static void main ( String args [] ) lanza una excepción { System . println ( "El servidor RMI se inició" ) ; try { //controlador de excepción especial para la creación del registro LocateRegistry . createRegistry ( 1099 ); System . println ( "registro RMI Java creado." ); } catch ( RemoteException e ) { //no hacer nada, el error significa que el registro ya existe System . out . println ( "el registro RMI Java ya existe." ); } //Crear una instancia de RmiServer RmiServer server = new RmiServer ( ); // Vincula esta instancia de objeto al nombre "RmiServer" Naming . rebind ( "//localhost/RmiServer" , server ); System . out . println ( "PeerServer enlazado en el registro" ); } }
RmiClient
claseimportar java.rmi.Naming ; clase pública RmiClient { public static void main ( String args [] ) lanza una excepción { RmiServerIntf servidor = ( RmiServerIntf ) Naming . lookup ( "//localhost/RmiServer" ); System . out . println ( servidor . getMessage ()); } }
Antes de ejecutar este ejemplo, necesitamos crear un archivo 'stub' para la interfaz que usamos. Para esta tarea, contamos con el compilador RMI: 'rmic'
Servidor Rmi de RMIC
Tenga en cuenta que desde la versión 5.0 de J2SE se ha agregado compatibilidad con archivos stub generados dinámicamente y rmic solo se proporciona para compatibilidad con versiones anteriores de runtime [3] o para programas que no proporcionan un número de puerto explícito (o cero) al exportar objetos remotos, lo cual es necesario para que sea posible generar stubs, como se describe en el Javadoc para UnicastRemoteObject. Vea el comentario en el constructor anterior.
java.rmi
(Referencia de API de Java de Sun para el paquete RMI)