Invocação de método remoto Java - Java remote method invocation

Um modelo de implementação típico de Java-RMI usando objetos stub e esqueleto . Java 2 SDK, Standard Edition, v1.2 removeu a necessidade de um esqueleto.

Na computação , o Java Remote Method Invocation ( Java RMI ) é uma API Java que executa a chamada de método remoto , o equivalente orientado a objeto das chamadas de procedimento remoto (RPC), com suporte para transferência direta de classes Java serializadas e coleta de lixo distribuída .

A implementação original depende dos mecanismos de representação de classe da Java Virtual Machine (JVM) e, portanto, só oferece suporte para fazer chamadas de uma JVM para outra. O protocolo subjacente a esta implementação apenas de Java é conhecido como Java Remote Method Protocol (JRMP). Para oferecer suporte ao código em execução em um contexto não JVM, os programadores desenvolveram posteriormente uma versão CORBA .

O uso do termo RMI pode denotar apenas a interface de programação ou pode significar a API e JRMP, IIOP ou outra implementação, enquanto o termo RMI-IIOP (leia-se: RMI sobre IIOP ) denota especificamente a interface RMI delegando a maior parte da funcionalidade para o apoio à implementação do CORBA .

A ideia básica do Java RMI, o protocolo de coleta de lixo distribuída (DGC) e grande parte da arquitetura subjacente à implementação original do Sun vêm do recurso de "objetos de rede" do Modula-3 .

Código generalizado

Os programadores da API RMI original generalizaram um pouco o código para oferecer suporte a diferentes implementações, como um transporte HTTP . Além disso, a capacidade de passar argumentos " por valor " foi adicionada ao CORBA para ser compatível com a interface RMI. Ainda assim, as implementações RMI-IIOP e JRMP não têm interfaces totalmente idênticas.

A funcionalidade RMI vem no pacote java.rmi, enquanto a maioria da implementação da Sun está localizada no sun.rmipacote. Observe que com as versões Java anteriores ao Java 5.0, os desenvolvedores tinham que compilar stubs RMI em uma etapa de compilação separada usando rmic. A versão 5.0 do Java e posteriores não requerem mais esta etapa.

Versão Jini

Jini oferece uma versão mais avançada do RMI em Java. Ele funciona de forma semelhante, mas fornece segurança mais avançada, recursos de descoberta de objetos e outros mecanismos para aplicativos de objetos distribuídos.

Exemplo

As classes a seguir implementam um programa cliente-servidor simples usando RMI que exibe uma mensagem.

RmiServerclasse - escuta as solicitações RMI e implementa a interface que é usada pelo cliente para invocar métodos remotos.

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); // required to avoid the 'rmic' step, see below
    }

    public String getMessage() {
        return MESSAGE;
    }

    public static void main(String args[]) throws Exception {
        System.out.println("RMI server started");

        try { //special exception handler for registry creation
            LocateRegistry.createRegistry(1099);
            System.out.println("java RMI registry created.");
        } catch (RemoteException e) {
            //do nothing, error means registry already exists
            System.out.println("java RMI registry already exists.");
        }
           
        //Instantiate RmiServer
        RmiServer server = new RmiServer();

        // Bind this object instance to the name "RmiServer"
        Naming.rebind("//localhost/RmiServer", server);
        System.out.println("PeerServer bound in registry");
    }
}

RmiServerIntfinterface - define a interface que é usada pelo cliente e implementada pelo servidor.

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RmiServerIntf extends Remote {
    String getMessage() throws RemoteException;
}

RmiClientclasse - este é o cliente que obtém a referência (um proxy) para o objeto remoto que vive no servidor e invoca seu método para obter uma mensagem. Se o objeto do servidor implementasse java.io.Serializable em vez de java.rmi.Remote, ele seria serializado e passado ao cliente como um valor.

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 executar este exemplo, precisamos fazer um arquivo 'stub' para a interface que usamos. Para esta tarefa, temos o compilador RMI - 'rmic'

  • Nota: fazemos um arquivo stub do arquivo '* .class' com a implementação da interface remota, não do arquivo '* .java'.
rmic RmiServer

Observe que, desde a versão 5.0 do J2SE, o suporte para arquivos stub gerados dinamicamente foi adicionado, e o rmic é fornecido apenas para compatibilidade com versões anteriores de tempos de execução ou para programas que não fornecem um número de porta explícito (ou zero) ao exportar objetos remotos, que é necessário para que os stubs gerados sejam possíveis, conforme descrito no Javadoc para UnicastRemoteObject. Veja o comentário no construtor acima.

Referências

links externos