
La invocación remota de métodos de Java ( 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 la 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 llamadas entre diferentes JVM. El protocolo subyacente a esta implementación exclusiva de Java se conoce como Protocolo de Método Remoto de Java (JRMP). Para admitir código que se ejecuta fuera de la JVM, los programadores desarrollaron posteriormente una versión CORBA .
El uso del término RMI puede referirse únicamente a 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 ) se refiere específicamente a 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 .
Código generalizado
Los programadores de la API RMI original generalizaron el código para admitir diferentes implementaciones, como el transporte HTTP . Además, se añadió a CORBA la capacidad de pasar argumentos " por valor " para que fuera compatible con la interfaz RMI. Sin embargo, las implementaciones RMI-IIOP y JRMP no tienen interfaces totalmente 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.rmipaquete . Cabe destacar que con versiones de Java anteriores a Java 5.0, los desarrolladores tenían que compilar los stubs RMI en un paso de compilación separado usando rmic. La versión 5.0 de Java y posteriores ya no requieren este paso, y los stubs estáticos se han dejado de usar desde Java 8.
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 que utiliza RMI y que muestra un mensaje.
RmiServerIntfinterfaz- Define la interfaz que utiliza el cliente y que implementa el servidor. Esta extiende la
java.rmi.Remoteinterfaz, que sirve para identificar una clase implementadora como aquella con métodos invocables remotamente.
paquete org.wikipedia.examples ;import java.rmi.Remote ; import java.rmi.RemoteException ;public interface RmiServerIntf extends Remote { String getMessage () throws RemoteException ; }RmiServerclase- Escucha las solicitudes RMI e implementa la interfaz que utiliza el cliente para invocar métodos remotos.
paquete org.wikipedia.examples ;import java.rmi.Naming ; import java.rmi.RemoteException ; import java.rmi.server.UnicastRemoteObject ; import java.rmi.registry.* ;public class RmiServer extends UnicastRemoteObject implements RmiServerIntf { public static final String MESSAGE = "Hello World" ;public RmiServer () throws RemoteException { super ( 0 ); // necesario para evitar el paso 'rmic', ver más abajo }public String getMessage () { return MESSAGE ; }public static void main ( String [] args ) throws Exception { System . out . println ( "Servidor RMI iniciado" );// Manejador de excepciones especial para la creación del registro try { LocateRegistry . createRegistry ( 1099 ); System . out . println ( "Registro Java RMI creado." ); } catch ( RemoteException e ) { // No hacer nada; el error significa que el registro ya existe System . out . println ( "El registro Java RMI ya existe." ); } // Instanciar RmiServer RmiServer server = new RmiServer ();// Vincula esta instancia de objeto al nombre "RmiServer" Naming.rebind ( " // localhost/RmiServer" , server ) ; System.out.println ( "PeerServer vinculado en el registro" ); } }RmiClientclase- Este es el cliente que obtiene la referencia (un proxy) al objeto remoto que reside en el servidor e invoca su método para obtener un mensaje. Si el objeto del servidor implementara
java.io.Serializableen lugar dejava.rmi.Remote, se serializaría y se pasaría al cliente como un valor. [ 2 ]
paquete org.wikipedia.examples ;import java.rmi.Naming ;public class RmiClient { public static void main ( String [] args ) throws Exception { RmiServerIntf server = ( RmiServerIntf ) Naming . lookup ( "//localhost/RmiServer" ); System . out . println ( server . getMessage ()); } }Antes de ejecutar este ejemplo, necesitamos crear un archivo 'stub' para la interfaz que utilizamos. Para esta tarea tenemos el compilador RMI: 'rmic'.
- Nota: creamos un archivo auxiliar a partir del archivo *.class con la implementación de la interfaz remota, no a partir del archivo *.java .
rmic RmiServerTenga en cuenta que desde la versión 5.0 de J2SE, se ha añadido soporte para archivos stub generados dinámicamente, y rmic solo se proporciona para compatibilidad con versiones anteriores de entornos de ejecución, [ 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 los stubs generados sean posibles, como se describe en la documentación Javadoc para UnicastRemoteObject. Consulte el comentario en el constructor anterior.
Referencias
- ↑ Taylor, Ian J (2005). De P2P a servicios web y redes : pares en un mundo cliente/servidor . Comunicaciones informáticas y redes. Londres: Springer-Verlag. doi : 10.1007/b138333 . ISBN 1852338695OCLC 827073874
- ↑ Wilson, M. Jeff (10 de noviembre de 2000). "Aprenda a usar proxies y RMI de forma inteligente" . 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
- "Invocación remota de métodos" . Oracle Technology Network for Java Developers . Redwood Shores, CA, EE. UU.: Oracle Corporation . Consultado el 14 de julio de 2014 .
- El tutorial de Java RMI es un buen punto de partida para aprender RMI. Consulta también el ejemplo "Hola Mundo" en RMI (Java 5).
- Curso online de Java RMI (Java 7) en Wayback Machine (archivado el 12/08/2012) : muy bueno para aprender Java RMI y como material de referencia.
- La página RMI en la documentación de JDK 8
java.rmi(Referencia de la API de Java para el paquete RMI)- Ann Wollrath; Roger Riggs; Jim Waldo . "Un modelo de objetos distribuidos para el sistema Java" (PDF) . Archivado (PDF) del original el 10 de octubre de 2022. Recuperado el 11 de febrero de 2009 .
- Programación de WebLogic RMI : una introducción a RMI en Oracle Weblogic.
- Invocación general de métodos remotos
- Componentes JDK
- Llamada a procedimiento remoto
