Você está na página 1de 21

Java 2 Standard Edition

Fundamentos de

Objetos Remotos
Helder da Rocha
www.argonavis.com.br

Sobre este mdulo


Este mdulo tem como objetivo dar uma viso geral, porm prtica, da criao e uso de objetos remotos em Java com RMI Para permitir a demonstrao de uma aplicao simples, vrios conceitos importantes, essenciais em aplicaes RMI reais foram omitidos, como
Necessidade de implantar um gerente de segurana Necessidade de divulgar um codebase (Classpath distribudo)

Para maiores detalhes, consulte as fontes de referncia para este curso


2

O que so objetos remotos


Objetos remotos so objetos cujos mtodos podem ser chamados remotamente, como se fossem locais
Cliente precisa, de alguma forma, localizar e obter uma instncia do objeto remoto (geralmente atravs de um proxy intermedirio gerado automaticamente) Depois que o cliente tem a referncia, faz chamadas nos mtodos do objeto remoto (atravs do proxy) usando a mesma sintaxe que usaria se o objeto fosse local

Objetos remotos abstraem toda a complexidade da Objetos Proxies comunicao em rede remotos locais
Estende o paradigma OO alm do domnio local Torna a rede transparente
Cliente Rede

Como implementar objetos remotos


Para usar objetos remotos, preciso ter uma infraestrutura que cuide da gerao das classes, comunicao e outros detalhes H duas solues disponveis para implementar objetos remotos em Java
OMG CORBA: requer o uso, alm de Java, da linguagem genrica OMG IDL, mas suporta integrao com outras linguagens Java RMI: para solues 100% Java
Interface de programao OMG IDL CORBA IIOP

Java
Java RMI JRMP

As duas solues diferem principalmente na forma de implementao Em ambas, um programa cliente poder chamar um mtodo em um objeto remoto da mesma maneira como faz com um mtodo de um objeto local

Interface para comunicao em rede

Objetos remotos com Java RMI


Java RMI (Remote Method Invocation) pode ser implementado usando protocolos e infraestrutura prprios do Java (JRMP e RMI Registry) ou usando IIOP e ORBs, prprios do CORBA JRMP - Java Remote Method Protocol Interface de programao
Pacote java.rmi - RMI bsico Ideal para aplicaes 100% Java.
OMG IDL Java IDL (CORBA)

Java
RMI-IIOP RMI-JRMP JRMP

IIOP - Internet Inter-ORB Protocol

Pacote javax.rmi - RMI sobre IIOP Ideal para ambientes heterogneos.

A forma de desenvolvimento similar


H pequenas diferenas na gerao da infraestrutura (proxies) e registro de objetos

IIOP

Interface de comunicao em rede

RMI sobre IIOP permite programao Java RMI e comunicao em CORBA, viabilizando integrao entre Java e outras linguagens sem a necessidade de aprender OMG IDL

RMI: funcionamento bsico


Um objeto remoto previamente registrado obtido, atravs de servidor de nomes especial: RMI Registry.
Permite que os objetos publicamente acessveis atravs da rede sejam referenciados atravs de um nome.

Servio de nomes: classe java.rmi.Naming


Mtodo Naming.lookup() consulta um servidor de nomes RMI e obtm uma instncia de um objeto remoto Exemplo (jogo de batalha naval):
Territorio mar = (Territorio)Naming.lookup("rmi://gamma/caspio");

Agora possvel chamar mtodos remotos de mar:


tentativa[i] = mar.atira("C", 9);

Arquitetura RMI
Uma aplicao distribuda com RMI tem acesso transparente ao objeto remoto atravs de sua Interface Remota
A "Interface Remota" uma interface que estende java.rmi.Remote A partir da Interface Remota e implementao do objeto remoto o sistema gera objetos (proxies) que realizam todas as tarefas necessrias para viabilizar a comunicao em rede
Objeto remoto RMIClient
Comunicao aparente

HelloImpl

java.rmi.Remote Stub HelloImpl_Stub RemoteHello


Comunicao real

Skeleton HelloImpl_Skel

Padres de Projeto: Proxy


A implementao RMI um exemplo do padro de projeto chamado Proxy Proxy uma soluo para situaes onde o objeto de interesse est inaccessvel diretamente, mas o cliente precisa operar em uma interface idntica
A soluo oferecida por Proxy criar uma classe que tenha a mesma interface que o objeto de interesse (implemente a mesma interface Java) e que implemente, em seus mtodos, a lgica de comunicao com o objeto inaccessvel. Em RMI, o proxy o Stub gerado automaticamente pelo ambiente de desenvolvimento (rmic)
8

Como usar RMI em 10 passos


O objetivo deste mdulo oferecer apenas uma introduo bsica a Java RMI. Isto ser feito atravs de um exemplo simples
1. Definir a interface 2. Implementar os objetos remotos 3. Implementar um servidor para os objetos 4. Compilar os objetos remotos 5. Gerar stubs e skeletons com rmic 6. Escrever, compilar e instalar o(s) cliente(s) 7. Instalar o stub no(s) cliente(s) 8. Iniciar o RMI Registry no servidor 9. Iniciar o servidor de objetos 10. Iniciar os clientes informando o endereo do servidor.
9

1. Definir a interface remota


Declare todos os mtodos que sero acessveis remotamente em uma interface Java que estenda java.rmi.Remote.
Todos os mtodos devem declarar throws java.rmi.RemoteException.

Isto deve ser feito para cada objeto que ser acessvel atravs da rede.
import java.rmi.*; public interface Mensagem extends Remote { public String getMensagem() throws RemoteException; public void setMensagem(String msg) throws RemoteException; }

10

2. Implementar os objetos remotos


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 mtodos declaram causar java.rmi.RemoteException inclusive o construtor, mesmo que seja vazio.
import java.rmi.server.*; import java.rmi.*; public class MensagemImpl extends UnicastRemoteObject implements Mensagem { private String mensagem = "Inicial"; public MensagemImpl() throws RemoteException {} public String getMensagem() throws RemoteException { return mensagem; } public void setMensagem(String msg) throws RemoteException { mensagem = msg; } }

11

3. Estabelecer um servidor
Crie uma classe que
a) Crie uma instncia do objeto a ser servido e b) Registre-a (bind ou rebind) no servio de nomes.
import java.rmi.*; public class MensagemServer { public static void main(String[] args) throws RemoteException { Mensagem mens = new MensagemImpl(); Naming.rebind("mensagens", mens); System.out.println("Servidor no ar. "+ " Nome do objeto servido: '" + "mensagens" +"'"); } }

12

4. Compilar os objetos remotos


Compile todas as interfaces e classes utilizadas para implementar as interfaces Remote
javac Mensagem.java MensagemImpl.java

13

5. Gerar stubs e skeletons


Use a ferramenta do J2SDK: rmic Ser gerado um arquivo stub
MensagemImpl_stub.class

e um arquivo skeleton
MensagemImpl_skel.class

para cada objeto remoto (neste caso, apenas um) RMIC = RMI Compiler
Use opo -keep se quiser manter cdigo-fonte Execute o rmic sobre as implementaes do objeto remoto j compiladas:
> rmic MensagemImpl

14

6. Compilar e instalar o(s) cliente(s)


Escreva uma classe cliente que localize o(s) objeto(s) no servio de nomes (java.rmi.Naming)
a) Obtenha uma instncia remota de cada objeto b) Use o objeto, chamando seus mtodos
import java.rmi.*; public class MensagemClient { public static void main(String[] args) throws Exception { String hostname = args[0]; String objeto = args[1]; Object obj = Naming.lookup("rmi://" + hostname + "/" + objeto); Mensagem mens = (Mensagem) obj; System.out.println("Mensagem recebida: " + mens.getMensagem()); mens.setMensagem("Fulano esteve aqui!"); } }

15

7. Instalar o stub no(s) cliente(s)


Distribua o cliente para as mquinas-cliente. A distribuio deve conter
Classe(s) que implementa(m) o cliente (HelloMensagem.class) Os stubs (HelloMensagem_stub.class) As interfaces Remote (Mensagem.class)
Em aplicaes reais, os stubs podem ser mantidos no servidor
O cliente faz download do stub quando quiser us-lo Para isto preciso definir algumas propriedades adicionais (omitidas no nosso exemplo simples) como Codebase (CLASSPATH distribudo), SecurityManager e polticas de segurana (Policy)

16

8. Iniciar o RMI Registry no servidor


No Windows
> start rmiregistry

No Unix
> rmiregistry &

(O RMI Registry fica "calado" quando est rodando)

Neste exemplo ser preciso iniciar o RMIRegistry no diretrio onde esto os stubs e interface Remote
Isto para que o RMIRegistry veja o mesmo CLASSPATH que o resto da aplicao Em aplicaes RMI reais isto no necessrio, mas preciso definir a propriedade java.rmi.server.codebase contendo os caminhos onde se pode localizar o cdigo
17

9. Iniciar o servidor de objetos


O servidor uma aplicao executvel que registra os objetos no RMIRegistry. Rode a aplicao:
> java MensagemServer Servidor no ar. Nome do objeto servido: mensagens

Neste exemplo ser preciso iniciar o servidor no diretrio onde esto os stubs e interface Remote
Isto para que o RMIRegistry veja o mesmo CLASSPATH que o resto da aplicao Em aplicaes RMI reais isto no necessrio, mas preciso definir a propriedade java.rmi.server.codebase contendo os caminhos onde se pode localizar o cdigo
18

10. Iniciar os clientes


Rode o cliente
Informe o endereo do servidor e objetos a utilizar
> java MensagemClient maquina.com.br mensagens

Exerccio
Implemente os exemplos mostrados, inventando uma mensagem diferente para seu objeto remoto. Use o seu cliente para acessar os objetos remotos registrados nas mquinas de seus colegas.

19

Resumo
java.rmi.Remote
extends interface Mensagem extends Remote{ void getMensagem() throws RemoteException; }

Mensagem.java

java.rmi.server.UnicastRemoteObject
implements extends Mensagem.java

2
MensagemImpl.java MensagemImpl_Skel MensagemImpl_Stub

MensagemServer.java

Mensagem h =(Mensagem) Naming.lookup("hello"); h.getMensagem();

MensagemImpl rf = new MensagemImpl(); Naming.bind(rf, "hello");

... void getMensagem throws RemoteException { System.out.println("Hello"); }

Stub

Skel

3 6
Java compiler

RMIC

MensagemClient

lookup()

RMIRegistry

bind()

MensagemServer MensagemImpl (obj remoto)

MensagemImpl_Stub

JRMP

MensagemImpl_Skel

20

Curso J100: Java 2 Standard Edition


Reviso 17.0

1996-2003, Helder da Rocha (helder@acm.org)

argonavis.com.br
21

Você também pode gostar