Home Programação Distribuída com RMI em Java
Post
Cancelar

Programação Distribuída com RMI em Java

Baseado nos cursos da Softblue

Introdução ao RMI

  • Remote Method Invocation

  • Permite chamar métodos em objetos que podem estar espalhados ela rede

  • Baseado numa arquitetura cliente/servidor

RMI registry

  • É um repositório de objetos remotos

  • Permite a localização de objetos por nome

  • Deve ser executado em algum computador da rede e seu endereço deve ser conhecido

graph TD
    A[Objeto Remoto] -->|O objeto remoto é registrado no registry| B(RMI Registry)
    C[Cliente] -->|O cliente busca o objeto no registry pelo nome| B

Trabalhando com objetos remotos

A interface do objeto remoto

1
2
3
4
public interface Calc extends Remote {//A interface deve estender java.rmi.Remote
    public int somar(int x, int y) throws RemoteException;//Os métodos declarados serão acessíveis remotamente
    public int subtrair(int x, int y) throws RemoteException;//Todos os métodos devem lançar java.rmi.RemoteException
}

Implementando os métodos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CalcImpl
    extends UnicastRemoteObject implements Calc {//Tipicamente extende UnicastRemoteObject, classe que implementa a interface Calc
    public CalcImpl() throws RemoteException {
    }
    @Override//Implementação dos métodos da interface

    public int somar(int x, int y) {
        return x + y;
    }
    @Override
    public int subtrair(int x, int y) {
        return x - y;
    }
}

Registrando o objeto

1
2
3
Calc c = new CalcImpl();//Cria o objeto
Registry registry = LocateRegistry.createRegistry(1099);//Inicia o RMI registry na porta 1099
registry.rebind("calc", c);//Registra o objeto no registry com o nome calc

Implementando um cliente

1
2
3
String url = "rmi://localhost:1099/calc";//Constrói a URL usada na busca do objeto
Calc calc = (Calc) Naming.lookup(url);//Procura o objeto no registry e recebe a sua referência
int r = calc.somar(10, 20));//Invoca o método no objeto remoto

Stubs e skeletons

graph LR
    A(Cliente) --> B(Stub)
    B -->|Rede| C(Skeleton)
    C --> D(Calclmpl)
  • O stub é um representante do objeto remoto no cliente. É implementado pelo Java.

  • O skeleton recebe as informações pela rede e invoca o objeto real. É implementado pelo Java.

  • Objetos das classes que trafegam pela rede devem implementar Serializable

RMI registry e os stubs

graph LR
    A(Objeto Remoto) -->|O stub do objeto é registrado no registry| B(RMI Registry)
    C(Cliente) -->|O cliente busca o objeto pelo nome| B
    B -->|O cliente recebe o stub do objeto remoto| C
    C --> D((Stub))
    D -->|Quando o cliente invoca o método usando o stub, a chamada trafega pela rede e é feita no objeto remoto| A
Esta postagem está licenciada sob CC BY 4.0 pelo autor.