stringtranslate.com

Invocación de método remoto de Java

Un modelo de implementación típico de Java-RMI que utiliza objetos stub y esqueleto . Java 2 SDK, Standard Edition, v1.2 eliminó la necesidad de un esqueleto.

En informática , 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 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 realizar 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 código que se ejecuta en un contexto que no sea 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 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 el apoyo a la implementación de CORBA .

La idea básica de Java RMI, el protocolo de recolección distribuida de basura (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ó a CORBA la capacidad de pasar argumentos " por valor " para que sea compatible con la interfaz RMI. Aún así, las implementaciones 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.rmipaquete. Tenga en cuenta que con las versiones de Java anteriores a Java 5.0, los desarrolladores tenían que compilar apéndices RMI en un paso de compilación separado usando 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.

RmiServerIntfinterfaz
define la interfaz que utiliza el cliente y que implementa el servidor.
importar java.rmi.Remote ; importar java.rmi.RemoteException ;  la interfaz pública RmiServerIntf extiende Remote { String getMessage () lanza RemoteException ; }         
RmiServerclase
escucha las solicitudes RMI e implementa la interfaz que utiliza el cliente para invocar métodos remotos.
importar java.rmi.Naming ; importar java.rmi.RemoteException ; importar java.rmi.server.UnicastRemoteObject ; importar java.rmi.registry.* ;    la clase pública RmiServer extiende UnicastRemoteObject implementa RmiServerIntf { public static final String MENSAJE = "Hola mundo" ;               public RmiServer () lanza RemoteException { super ( 0 ); // requerido para evitar el paso 'rmic', ver más abajo }        cadena pública getMessage () { return MENSAJE ; }       public static void main ( String args [] ) lanza una excepción { System . afuera . println ( "servidor RMI iniciado" );         try { //controlador de excepciones especial para la creación del registro LocateRegistry . crearRegistro ( 1099 ); Sistema . afuera . println ( "registro RMI de Java creado." ); } catch ( RemoteException e ) { //no hacer nada, el error significa que el registro ya existe System . afuera . println ( "el registro RMI de Java ya existe." ); } //Crear una instancia de RmiServer Servidor RmiServer = nuevo RmiServer ();                    // Vincula esta instancia de objeto al nombre "RmiServer" Naming . volver a vincular ( "//localhost/RmiServer" , servidor ); Sistema . afuera . println ( "PeerServer vinculado al registro" ); } }    
RmiClientclase
este es el cliente que obtiene la referencia (un proxy) al objeto remoto que vive en el servidor e invoca su método para recibir un mensaje. Si el objeto del servidor implementara java.io.Serializable en lugar de java.rmi.Remote, se serializaría y se pasaría al cliente como un valor. [2]
importar java.rmi.Naming ; clase pública RmiClient { public static void main ( String args [] ) lanza una excepción { servidor RmiServerIntf = ( RmiServerIntf ) denominación . búsqueda ( "//localhost/RmiServer" ); Sistema . afuera . println ( servidor.getMessage ( ) ); } }                 

Antes de ejecutar este ejemplo, necesitamos crear un archivo 'stub' para la interfaz que utilizamos. Para esta tarea contamos con el compilador RMI - 'rmic'

rmic RmiServer

Tenga en cuenta que desde la versión 5.0 de J2SE se ha agregado soporte para archivos stub generados dinámicamente, y rmic solo se proporciona para compatibilidad con tiempos de ejecución anteriores, [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 de arriba.

Referencias

  1. ^ Taylor, Ian J (2005). De P2P a servicios web y grids: 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 ]
  2. ^ Wilson, M. Jeff (10 de noviembre de 2000). "Sea inteligente con proxies y RMI". Mundo Java . Consultado el 18 de julio de 2020 .
  3. ^ "Notas de la versión de Java RMI". Oráculo . Consultado el 9 de mayo de 2012 .

enlaces externos