Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo
Introduo
Pontos importantes:
Principais componentes;
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.
Mtodos Remotos
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.
Implementao
Implementao RMI
intercepta as chamadas de mtodos feitas pelo cliente para que a varivel de referncia da interface redirecione essas chamadas para o servio RMI remoto;
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:
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
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
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
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
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
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
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
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
Exemplo
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
Calc.java
import java.net.*; import java.rmi.*; public interface Calc extends Remote { int sum(int x1, int x2) throws RemoteException; }
19
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
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
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
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
Concluso
Baseada na resposta; Inclusive o projeto final da disciplina; RMI para JME: s fazendo o download da API;
24
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