2
Objetivos
§ Explorar os conceitos acerca da criação e uso de objetos
objetos remotosremotos em Java com RMI
§ Por que e quando usar objetos remotos, principais classes e métodos da API Java, pré-condições,
tecnologias, características, vantagens de se usar RMI e boas práticas de programação.
§ Apresentar uma demonstração de uma aplicaaplicaççãoão simples que usa objetos distribuídos
§ O que é necessário para acessar um objeto remoto via uma rede de computadores e alguns erros comuns de programadores ao trabalharem com RMI
3
Motivação
§ Até aqui, todas as chamadas de métodos têm sido realizadas em objetos no mesmo heap de memória
§ Ou seja, não só o objeto que invoca o método, mas o que recebe a mensagem estão rodando na mesma JVM
§ A JVM é responsável por “saber” onde os objetos estão localizados no heap
§ Ela sabe como gerenciar estes objetos e acessá-los via suas referências, adequadamente.
§ Porém, uma JVM não tem como saber sobre referências ou objetos em uma outra JVM
§ Ainda que duas instâncias de JVM distintas estejam rodando em uma mesma máquina
4
Motivação
§ E o que fazer quando temos que invocar um método em um objeto que reside em uma outra máquina?
§ Uma aplicação distribuída (e-commerce, jogos…) onde partes desta executam simultaneamente em vários
computadores distintos
§ Aplicações distribuídas são, hoje, uma realidade!
§ São compostas de diversos processos rodando em
diversas máquinas, trocando mensagens e trabalhando de forma cooperativa para realizar uma tarefa
§ Ex.: acesso a um banco de dados remoto, a própria Web! (um browser acessando o servidor Web)
5
Motivação
§ Uma solução inicial seria procurar (estudar) alguma API da linguagem Java para, por exemplo:
§ Estabelecer conexões de rede entre máquinas, enviar e receber dados via rede, fechar conexões, esperar por conexões em uma determinada porta da máquina
§ Classe Socket (e ServerSocket) no pacote java.net
§ Sockets escondem os detalhes de baixo nível das redes (tipo de transmissão, tamanho de pacote da rede,
retransmissão, etc.)
§ Mas, será que existe alguma forma de interagir com um objeto remoto localizado em uma outra máquina como se ele fosse local?
6
O que são objetos remotos?
§ Objetos remotos são objetos cujos métodos ser chamados remotamente, como se fossem locais
§ Cliente precisa, de alguma forma, localizar e obter uma instância do objeto remoto (geralmente através de um proxy intermediário gerado automaticamente)
§ Depois que o cliente tem a referência, faz chamadas nos métodos do objeto remoto (através do proxy) usando a mesma sintaxe que usaria se o objeto fosse local
§ Objetos remotos abstraem toda a complexidade da comunicação em rede
§ Estende o paradigma OO além do domínio local
§ Torna a rede transparente
7
Tecnologias de mercado
§ É preciso ter uma infra-estrutura que cuide da geração das classes, comunicação e outros detalhes
§ Há duas soluções disponíveis para implementar objetos remotos em Java:
§ CORBA: requer uso de uma linguagem genérica IDL, mas suporta integração com outras linguagens
§ Java RMI: para soluções 100% Java
§ As duas diferem principalmente na forma de implementação
§ Mas permitem que um programa cliente chame um método em um objeto
remoto como faz com um objeto local
8
Objetos remotos com Java RMI
§ O principal objetivo da tecnologia RMI é prover um mecanismo de programação o mais próximo possível da programação convencional
§ Porém, oferecendo poderosos serviços que permitem a distribuição de aplicações e de objetos de sistemas
§ Como RMI é baseado em Java, ele trás a reboque todos os benefícios da linguagem Java
§ Separação entre comportamento e implementação
§ Clientes: só se interessam pelos serviços “anunciados”
§ Servidor: implementa cada um dos serviços oferecidos
9
RMI: funcionamento básico
§ Um objeto remoto previamente registrado é obtido, através de servidor de nomes especial: RMI Registry
§ Permite que os objetos publicamente acessíveis através da rede sejam referenciados através de um nome.
§ Serviço de nomes: classe java.rmi.Naming
§ Método Naming.lookup() consulta um servidor de nomes RMI e obtém uma instância de um objeto remoto (o proxy)
§ Exemplo:
Jogo jogo = (Jogo)
Naming.lookup(“rmi://200.139.151.37/paciencia”);
§ Agora, podemos chamar os métodos do jogo:
jogada[i] = jogo.embaralhar();
10
Arquitetura RMI
§ Uma aplicação distribuída com RMI tem acesso transparente ao objeto remoto através de sua Interface remota
§ A Interface Remota é uma interface que estende de java.rmi.Remote
§ A partir da Interface Remota e implementação do objeto remoto o sistema gera objetos (proxies) que realizam todas as tarefas
necessárias para viabilizar a comunicação em rede
11
Como usar RMI passo-a-passo
§ Um dos objetivos deste módulo é oferecer uma
introdução prática à Java RMI. Isto será feito através de um exemplo simples (deve ser replicado em casa)
Definir a interface remota
Implementar o objeto remoto
Implementar um servidor para o objeto
Compilar o objeto remoto
Gerar stubs e skeletons com rmic
Escrever, compilar e instalar o cliente
Instalar o stub no cliente
Iniciar o RMI Registry no servidor
Iniciar o servidor de objetos
Iniciar o cliente que vai acessar o servidor
12
1. Definir a interface remota
§ Declare todos os métodos que o programa cliente poderá chamar remotamente em uma interface que estenda de java.rmi.Remote
§ Todos os métodos devem declarar throws java.rmi.RemoteException
§ Isto deve ser feito para cada objeto que será acessível através da rede
import java.rmi.Remote;
import java.rmi.RemoteException;
interface Mensagem_IF extends Remote {
public String getMensagem() throws RemoteException;
public void setMensagem(String mensagem)
throws RemoteException;
}
13
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ServicoDeMensagens extends UnicastRemoteObject
implements Mensagem_IF { private String mensagem = “Não há nenhuma mensagem”;
public ServicoDeMensagens() throws RemoteException {}
public String getMensagem() throws RemoteException { return this.mensagem;
}
public void setMensagem(String mensagem) throws RemoteException{
this.mensagem = mensagem;
} }
2. Implementar o objeto remoto
§ Cada objeto remoto é uma classe que estende a classe java.rmi.server.UnicastRemoteObject e que implementa a interface remota criada no passo 1.
§ Todos os métodos declaram causar java.rmi.RemoteException
§ Inclusive o construtor, mesmo que seja vazio.
14
3. Implementar um servidor
§ Crie uma classe que:
§ Crie uma instância do objeto a ser servido
§ Registre (rebind) o objeto (com um nome) no servidor de nomes RMI Registry
import java.rmi.Naming;
public class Servidor {
public static void main( String[] args ){
try {
Mensagem_IF servidor = new ServicoDeMensagens();
Naming.rebind("servidormsg", servidor);
System.out.println("Servidor de mensagens no ar.");
} catch (Exception e ) { e.printStackTrace();
} } }
15
4. Compilar o objeto remoto
§ Compile todas as classes e interfaces utilizadas para definir a interface java.rmi.Remote
javac Mensagem_IF.java
ServicoDeMensagens.java
§ [obs.] no Eclipse, este passo não é tão crítico. Basta apenas salvar os arquivos que os bytecodes .class
serão gerados (facilmente) de forma automática
16
5. Gerar stubs e skelektons
§ Use a ferramenta do J2SDK: rmic
§ Será gerado um arquivo stub (o proxy)
ServicoDeMensagens_Stub.class
e um arquivo skeleton
ServicoDeMensagens_Skel.class
para cada objeto remoto (neste caso, apenas um)
§ RMIC = RMI Compiler
§ Use opção -keep se quiser manter código-fonte
§ Execute o rmic sobre as implementações do objeto remoto já compiladas
% rmic ServicoDeMensagens
17
6. Compilar e instalar o(s) cliente(s)
§ Agora, escreva uma classe (o cliente) que irá
procurar, no sistema de nomes java.rmi.Naming, o(s) objeto(s) remotos desejado(s):
§ Obtenha uma instância remota do objeto (lookup)
§ Use o objeto, chamando seus métodos
import java.rmi.Naming;
public class Cliente {
public static void main( String[] args ){
try {
Mensagem_IF obj = (Mensagem_IF) Naming.lookup(
"rmi://192.168.0.1/servidormsg" );
System.out.println(“Recebido:“ + obj.getMensagem());
obj.setMensagem(“Bom dia!”);
} catch (Exception e ) { e.printStackTrace();
} } }
18
7. Instalar os stubs no cliente
§ Distribua os clientes para as máquinas-cliente. A distribuição deve conter:
Classe(s) que implementa(m) o(s) cliente(s)
Cliente.class
O(s) stub(s)
ServicoDeMensagens_Stub.class
A(s) interface(s) remota(s) (Mensagem_IF.class)
19
8. Iniciar o RMI Registry no servidor
§ No Windows
% start rmiregistry
(o RMI Registry fica "calado" quando está rodando)
§ Neste exemplo será preciso iniciar o RMI Registry no diretório onde estão os stubs e interface Remote
§ Isto é para que o RMI Registry veja o mesmo CLASSPATH que o resto da aplicação
20
9. Iniciar o servidor de objetos
§ O servidor é uma aplicação executável que registra os objetos no RMIRegistry. Rode a aplicação:
% java ServidorDeMensagens
“Servidor de mensagens no ar.”
§ Neste exemplo será preciso iniciar o servidor no diretório onde estão os stubs e interface Remote
§ Isto é para que o RMI Registry veja o mesmo CLASSPATH que o resto da aplicação
21
10. Rode o cliente
§ Finalmente, chame a máquina virtual Java para inicializar o Cliente. Neste exemplo, ele procura pelo serviço de nomes e usa o objeto remoto via rede.
java Cliente
Exercício
Implemente o exemplo mostrado, passando mensagens diferentes para o objeto remoto. Tente acessar o objeto
remoto na máquina de um colega
22
Para um bom aproveitamento:
Para um bom aproveitamento:
§ Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas
§ Resolva todas as questões da lista de objetos lista de objetos remotos com RMI
remotos com RMI
§ Procure o professor ou monitor da disciplina e questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto para a primeira avaliação.
§ Este é apenas um dos assuntos abordados na prova!