No mundo da programação distribuída nós precisamos nos comunicar com outros sistemas que ficam fora da nossa fronteira de aplicação então nós precisamos nos preocupar com rede, acesso e vários outros problemas decorrentes dessa prática. Quanto utilizamos o socket nós temos o problema do trabalho diretamente com o stream de bytes, o que pode se tornar um problema pois errar é humano. Poderiamos trabalhar com RPC já que as chamadas são transparentes ao desenvolvedor, contudo no mundo java nós precisamos trabalhar diretamente com objetos.
Para implementar um objeto remoto nós precisamos criar uma interface que extende a interface java.rmi.Remote, também é preciso que os métodos remotos lancem excessões do tipo java.rmi.RemoteException.
// Interface necessária
public interface ObjetoRemoto extends Remote {
public String getNome() throws RemoteException;
}
Para criar um objeto remoto nós precisamos então implementar a interface recem criada e extender a classe UnicastRemoteObject. Vale notar que todos os métodos que serão invocados remotamente e o construtor da classe precisam fazer o thowrs RemoteException.
public class Pessoa extends UnicastRemoteObject implements ObjetoRemoto {
public Pessoa() throws RemoteException;
public String getNome() throws RemoteException {
return "Nome da pessoa";
}
}
Para criarmos o servidor nós utilizamos o LocateRegistry e o Naming.rebind para registrar o objeto no servidor RMI.
public class ServidorRMI {
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
Pessoa pessoa = new Pessoa();
Naming.rebind("PessoaOBjetoDistribuido", pessoa);
} catch (Exception e) {}
}
}
Para criar um cliente é necessário apenas buscar no servidor de registro pelo nome do objeto que desejamos utilizar, nesse exemplo utilizamos o PessoaOBjetoDistribuido, registrado anteriormente no servidor. Vale notar que após fazer o lookup pelo objeto, nós precisamos fazer o casting para a interface que ele implementa, neste caso utilizamos a ObjetoRemoto.
public class ClienteRMI {
public static void main(String[] args) {
try {
ObjetoRemoto pessoa = (ObjetoRemoto) Naming.lookup("PessoaOBjetoDistribuido");
System.out.println(pessoa.getNome());
} catch (Exception e) {}
}
}