En informática , Java Remote Method Invocation ( Java RMI ) es una API de Java que realiza la invocación remota de métodos , 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 Java Virtual Machine (JVM) y, por lo tanto, solo admite la realización de llamadas de una JVM a otra. El protocolo subyacente a esta implementación solo de Java se conoce como Protocolo de método remoto de Java (JRMP). Para admitir el código que se ejecuta en un contexto no 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 de CORBA de apoyo .
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 .
Código generalizado
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ó la capacidad de pasar argumentos " por valor " a CORBA para que sea compatible con la interfaz RMI. Aún así, las implementaciones de RMI-IIOP y JRMP no tienen interfaces completamente idénticas.
La funcionalidad RMI viene 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 stubs RMI en un paso de compilación separado utilizando rmic
. La versión 5.0 de Java y posteriores ya no requieren este paso.
Versión Jini
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]
Ejemplo
Las siguientes clases implementan un programa cliente-servidor simple usando RMI que muestra un mensaje.
RmiServer
clase : escucha las solicitudes de RMI e implementa la interfaz que utiliza el cliente para invocar métodos remotos.
import java.rmi.Naming ; import java.rmi.RemoteException ; import java.rmi.server.UnicastRemoteObject ; importar java.rmi.registry. * ;public class RmiServer extiende UnicastRemoteObject implementa RmiServerIntf { public static final String MESSAGE = "Hello World" ; 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 Exception { System . fuera . println ( "servidor RMI iniciado" ); try { // controlador de excepciones especiales para la creación de registros LocateRegistry . createRegistry ( 1099 ); Sistema . fuera . println ( "registro RMI java creado" ); } catch ( RemoteException e ) { // no hacer nada, el error significa que el registro ya existe System . fuera . println ( "el registro RMI de Java ya existe" ); } // Crear una instancia de RmiServer RmiServer server = new RmiServer (); // Vincular esta instancia de objeto al nombre "RmiServer" Naming . rebind ( "// localhost / RmiServer" , servidor ); Sistema . fuera . println ( "PeerServer vinculado en el registro" ); } }
RmiServerIntf
interfaz : define la interfaz que utiliza el cliente e implementada por el servidor.
import java.rmi.Remote ; import java.rmi.RemoteException ;La interfaz pública RmiServerIntf extiende Remote { String getMessage () lanza RemoteException ; }
RmiClient
clase : este es el cliente que obtiene la referencia (un proxy) al objeto remoto que vive en el servidor e invoca su método para obtener un mensaje. Si el objeto del servidor implementó java.io.Serializable en lugar de java.rmi.Remote, sería serializado y pasado al cliente como un valor. [2]
import java.rmi.Naming ;public class RmiClient { public static void main ( String args [] ) lanza Exception { RmiServerIntf server = ( RmiServerIntf ) Naming . lookup ( "// localhost / RmiServer" ); Sistema . fuera . println ( servidor . getMessage ()); } }
Antes de ejecutar este ejemplo, necesitamos crear un archivo 'stub' para la interfaz que usamos. Para esta tarea tenemos el compilador RMI - 'rmic'
- Nota: hacemos un archivo stub del archivo '* .class' con la implementación de la interfaz remota, no del archivo '* .java'.
rmic RmiServer
Tenga en cuenta que, dado que se agregó la versión 5.0 de J2SE, se agregó soporte para archivos stub generados dinámicamente, y rmic solo se proporciona para compatibilidad con versiones anteriores de tiempos de ejecución, [3] o para programas que no brindan un número de puerto explícito (o cero) al exportar objetos remotos, que son necesarios para que los stubs generados sean posibles, como se describe en el Javadoc para UnicastRemoteObject. Vea el comentario en el constructor de arriba.
Referencias
- ^ Taylor, Ian J (2005). De P2P a servicios web y redes: pares en un mundo cliente / servidor . Comunicaciones y redes informáticas. Londres: Springer-Verlag. doi : 10.1007 / b138333 . ISBN 1852338695. OCLC 827073874 .[ página necesaria ]
- ^ Wilson, M. Jeff (10 de noviembre de 2000). "Sea inteligente con los proxies y RMI" . JavaWorld . Consultado el 18 de julio de 2020 .
- ^ "Notas de la versión de Java RMI" . Oracle . Consultado el 9 de mayo de 2012 .
enlaces externos
- "Inicio de invocación de método remoto" . Red de tecnología de Oracle para desarrolladores de Java . Redwood Shores, CA, EE.UU .: Oracle Corporation . Consultado el 14 de julio de 2014 .
- El tutorial de RMI de Java : un buen punto de partida para aprender RMI. Consulte también Hello World en RMI
- la formación en línea de Java RMI : muy buena para la formación de JavaRMI y como referencia
- La página RMI en los documentos JDK
java.rmi
(Referencia de la API de Java de Sun para el paquete RMI)- Ann Wollrath; Roger Riggs; Jim Waldo . "Un modelo de objetos distribuidos para el sistema Java" (PDF) . Consultado el 11 de febrero de 2009 . Cite journal requiere
|journal=
( ayuda ) - Programación de WebLogic RMI : una introducción a RMI en Oracle Weblogic.
- Invocación de método remoto general