Você está na página 1de 25

Sistemas Distribudos

Introduo ao Java RMI

Prof. Geraldo Sarmento


http://sites.google.com/site/geraldoasneto

Introduo

Introduo

Pontos importantes:

Estrutura bsica de um servio RMI;

Principais componentes;

Implementao de um servio RMI; Exemplo prtico: calculadora distribuda;

Prof. Geraldo Sarmento

Mtodos Remotos em Java

Mtodos Remotos

Sistemas distribudos requerem que aplicaes executando em diferentes espaos de endereamento, potencialmente em mquinas diferentes, sejam capazes de trocar dados; Java RMI um mecanismo que permite um objeto invocar um mtodo de outro objeto que existe em outro espao de endereamento;

Permite que um objeto executando sobre uma determinada JVM invoque mtodos sobre um objeto executando sobre outra JVM.

Prof. Geraldo Sarmento

Mtodos Remotos

A denio e a implementao do comportamento so conceitos separados:

Denio do servio remoto: interface (interface); Implementao do servio remoto: classe (class);

A arquitetura RMI torna o uso de objetos Java distribudos similar ao uso de objetos Java locais;

Transparncia de acesso.

Prof. Geraldo Sarmento

Implementao

Implementao RMI

Camada Stub e Skeleton:

intercepta as chamadas de mtodos feitas pelo cliente para que a varivel de referncia da interface redirecione essas chamadas para o servio RMI remoto;

Camada Remote Reference Layer:

interpreta e gerencia referncias feitas dos clientes para os objetos do servio remoto. A conexo do cliente ao servidor Unicast (um-para-um);

Camada de Transporte:

baseada nas conexes TCP/IP entre as maquinas em uma rede;

Como a conexo cliente-servidor implementada?


8

Prof. Geraldo Sarmento

Argumentos e Valores de Retorno

Podem ser passados de/para um mtodo remoto qualquer entidade que seja uma instncia de um tipo primitivo, objeto remoto ou objeto serializvel (que implementa a interface java.io.Serializable;

Alguns objetos no atendem a estes critrios, normalmente por encapsular informao que faz sentido somente em um unico espao de endereamento, como threads e descritores de arquivos; Muitas classes Serializable; core Java implementam a interface

Prof. Geraldo Sarmento

Objetos Remotos e Locais

Objetos remotos so passados por referncia; Objetos locais so passados por cpia, utilizando-se o mecanismo de serializao; Por padro, todos os campos so copiados excetos aqueles marcados como estticos ou transientes;

10

Prof. Geraldo Sarmento

Localizando o Servio Remoto RMI

Pode-se utilizar diferentes tipos de servios de diretrio, incluindo JNDI (Java Naming and Directory Interface); O prprio RMI inclue um simples servio, chamado de RMI Registry; Ele executa em cada maquina que hospeda o servio remoto, por denio na porta 1099;

11

Prof. Geraldo Sarmento

Localizando o Servio Remoto RMI

O servidor:

Cria um servio remoto, instanciando o objeto que implemente aquele servio; Exporta aquele objeto para o RMI. Quando o objeto exportado o RMI cria um servio que aguarda as conexes do cliente; Registra o objeto no RMI Registry, com um nome pblico;

12

Prof. Geraldo Sarmento

Localizando o Servio Remoto RMI

O Cliente:

O RMI Registry acessado atravs da classe esttica Naming; Ela prov o mtodo lookup(), que aceita a URL que especica o nome do servidor e o nome do servio desejado e retorna uma referncia remota para o objeto do servio; A URL formada como seguinte:

rmi://<host_name>[:port_number]/<service_name>

13

Prof. Geraldo Sarmento

Desenvolvendo um Servidor

14

Desenvolvendo um Servidor
1)Criar a interface do servidor, que deve estender a classe Remote.
Todo mtodo deve lanar a exceo RemoteException;

2)Implementar a interface criada; 3)Escrever o cdigo que instancia a implementao do servidor, exporta o objeto para o RMI e o registra junto ao servio de nomes da tecnologia Java (RMI registry).

15

Prof. Geraldo Sarmento

Servios de nome RMI Registry

LocateRegistry:

classe responsvel por criar o stub para acesso ao servio de registro (Registry); cria e exporta uma instncia de Registry em uma mquina local que aceita pedidos em uma porta especca;
createRegistry(int getRegistry(): port):

Alguns mtodos:

retorna uma referncia para o objeto remoto Registry para a mquina local no porta 1099 (porta padro do servio de registro);
getRegistry(String host):

retorna um referncia para o objeto remoto Registry na mquina especfica ca na porta 1099;
16

Prof. Geraldo Sarmento

Servios de nome RMI Registry

Mtodos da interface Registry:

void bind(String name, Remote referncia remota ao nome especicado;

obj): associa a

String[] list(): retorna um array dos nomes registrados; Remote lookup(String name): retorna a referncia remota correspondente ao nome especicado; void rebind(String name, Remote obj): substitui a associao para o nome especado, amarrando-o referncia remota especicada; void unbind(String name): remove a associao para o nome especicado;

17

Prof. Geraldo Sarmento

Exemplo

Desenvolvendo uma calculadora distribuda; So necessrias as classes:

Calc.java : que na verdade uma interface que estende Remote; CalcImpl.java : uma classe que implementa a interface e, consequentemente, os mtodos que sero acessados remotamente; CalcServer.java : instancia o objeto remoto e o registra de modo que o servio registry saiba de sua existncia; CalcClient.java : define o obejto que far a invocao dos mtodos remotos.

18

Prof. Geraldo Sarmento

Calc.java
import java.net.*; import java.rmi.*; public interface Calc extends Remote { int sum(int x1, int x2) throws RemoteException; }

19

Prof. Geraldo Sarmento

CalcImpl.java
import import import import java.rmi.*; java.rmi.server.*; java.rmi.registry.*; java.net.*;

public class CalcImpl extends UnicastRemoteObject implements Calc { public CalcImpl() throws RemoteException{ super(); } public int sum(int x1, int x2) { return x1 + x2; } }

20

Prof. Geraldo Sarmento

CalcServer.java
import import import import java.net.*; java.rmi.*; java.rmi.server.*; java.rmi.registry.*;

public class CalcServer { public static void main (String args [ ]) { try { //Cria CalcImpl CalcImpl obj = new CalcImpl(); //Substituindo a associao de obj para o servidor CalcServer Naming.rebind("CalcServer", obj); System.out.println("Calculator Server v.0.2 - ready."); } catch(Exception e) { System.out.println("CalcServer erro"+ e.getMessage()); } } }

21

Prof. Geraldo Sarmento

CalcClient.java
import import import import import java.net.*; java.rmi.*; java.rmi.registry.*; java.rmi.server.*; java.util.Scanner;

public class CalcClient { public static void main(String args[]) { try { //Lendo os nmeros Scanner dado1 = new Scanner(System.in); Scanner dado2 = new Scanner(System.in); System.out.println("Digite dois numeros: "); int num1 = dado1.nextInt(); int num2 = dado2.nextInt(); //Recuperando a referncia remota do servidor Calc obj = (Calc)Naming.lookup("rmi://localhost/CalcServer"); //Invocando o mtodo remoto sum(x1,x2) System.out.println("A soma desses dois numeros eh: "+obj.sum(num1,num2)); } catch(Exception e) { System.out.println("CalcClient erro"+ e.getMessage()); } System.exit(0); } } 22

Prof. Geraldo Sarmento

Executando a calculadora

Compilando todas as classes: javac Calc*.java Gerando o stub: rmic CalcImpl Executando o servio de registro (em background): rmiregistry & Executando o servidor: java CalcServer Executando o cliente: java CalcClient
23

Prof. Geraldo Sarmento

Concluso

Uma introduo sobre Java RMI;

Invocao de mtodos remotos; Comunicao sncrona e transiente;

Baseada na resposta; Inclusive o projeto final da disciplina; RMI para JME: s fazendo o download da API;

Poderosa ferramenta para o desenvolvimento de aplicaes distribudas:

Java RMI j vem disponvel para JSE:

24

Prof. Geraldo Sarmento

Bibliografia

BSICA:

COULOURIS, G.; DOLLIMORE, J.; KINDBERG, T.. Distributed Systems: Concepts and Design. 4th Edition. Addison Wesley, 1994. TANENBAUM, A. S.; STEEN, M. Van.. Distributed Systems: Principles and Paradigms. 2nd Edition. Prentice Hall, 2006.

COMPLEMENTAR:

25

Você também pode gostar