A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ronaldo Celso Messias Correia Invocação de Métodos Remotos RMI (Remote Method Invocation)

Apresentações semelhantes


Apresentação em tema: "Ronaldo Celso Messias Correia Invocação de Métodos Remotos RMI (Remote Method Invocation)"— Transcrição da apresentação:

1 Ronaldo Celso Messias Correia Invocação de Métodos Remotos RMI (Remote Method Invocation)

2 Programação com Objetos Distribuídos Um sistema de objetos distribuídos permite a operação com objetos remotos A partir de uma aplicação cliente orientada a objetos, obter uma referência para um objeto que oferece o serviço desejado e, através dessa referência, invocar métodos desse objeto Dois mecanismos são oferecidos em Java Java RMI Java IDL

3 Java RMI (Remote Method Invocation) É uma abstração utilizada para comunicação em rede Possibilita que um objeto ativo em uma máquina virtual Java possa interagir com objetos de outras máquinas virtuais Java, independente da localização A operação de RMI está baseada num ambiente de comunicação específico formado por três elementos: O servidor Cria objetos remotos (que serão invocados através do sistema RMI) Deve especificar uma interface contendo os métodos a serem disponibilizados para acesso remoto e ainda estabelece uma associação entre o objeto da classe que implementa esses métodos e um endereço IP e porta TCP locais Espera por chamadas dos clientes aos métodos dos objetos criados O cliente Obtém referências para os objetos remotos disponibilizados pelo servidor Invoca os métodos dos objetos como se estes fossem locais O Servidor de registro Funciona de forma parecida com um servidor DNS Armazena as informações de localização dos servidores RMI que estejam registrados Os servidores RMI precisam se associar ao servidor de registro Os clientes RMI precisam consultar esses servidores Ambos devem saber o endereço do servidor de registros

4 Arquitetura RMI Oferece a transparência de localização através da organização de três camadas entre os objetos cliente e servidor: A camada de stub/skeleton oferece as interfaces que os objetos da aplicação usam para interagir entre si A camada de referência remota é o middleware entre a camada de stub/skeleton e o protocolo de transporte. É nesta camada que são criadas e gerenciadas as referências remotas aos objetos A camada do protocolo de transporte oferece o protocolo de dados binários que envia as solicitações aos objetos remotos pela rede.

5 Interface para um serviço RMI A especificação de uma interface remota é equivalente à definição de qualquer interface em Java, a não ser pelos seguintes detalhes: A interface deverá, direta ou indiretamente, estender a interface Remote (do pacote java.rmi) Remote Todo método da interface deverá declarar que a exceção RemoteException (ou uma de suas superclasses) pode ser gerada na execução do método RemoteException Exemplo: // Count Interface import java.rmi.*; public interface Count extends Remote { void set(int val) throws RemoteException; void reset() throws RemoteException; int get() throws RemoteException; int increment() throws RemoteException; } }

6 Serviço remoto em RMI Definido por meio de uma classe que implementa a interface especificada Incluir as funcionalidades para que um objeto dessa classe possa ser acessado remotamente como um servidor. Classe abstrata RemoteServer, do pacote java.rmi.server RemoteServerjava.rmi.server Uma subclasse concreta de RemoteServer oferecida no mesmo pacote é UnicastRemoteObject, que mantém uma conexão ponto- a-ponto com cada cliente que o referenciaUnicastRemoteObject import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class CountImpl extends UnicastRemoteObject implements Count { private int sum; public CountImpl() throws RemoteException { } public void set(int val) throws RemoteException { sum = val; } public void reset() throws RemoteException { sum = 0; } public int get() throws RemoteException { return sum; } public int increment() throws RemoteException { return sum++; } }

7 O Servidor RMI Um objeto servidor RMI simples deve realizar as seguintes tarefas: Criar uma instância do objeto que implementa o serviço Disponibilizar o serviço através do mecanismo de registro // CountServer.java import java.rmi.registry.*; import java.rmi.*; public class CountServer { public static void main(String[] args) { try {// Localizador do servidor de registro e nome pelo qual o serviço será posteriormente localizado String serviceName = // /Count001"; // Cria objeto servidor CountImpl myCount = new CountImpl(); // Registra o objeto servidor Naming.rebind(serviceName, myCount); // Servidor está preparado para solicitações de clientes System.out.println("Count Server ready."); } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); e.printStackTrace(); } } }

8 Registro de RMI O programa servidor registra os objetos com o serviço de registro de partida e o cliente recupera stubs para esses objetos O aplicativo rmiregistry é uma implementação de um serviço de nomes para RMI O serviço de nomes é uma espécie de diretório, onde cada serviço disponibilizado na plataforma é registrado através de um nome do serviço, uma string única para cada objeto que implementa serviços em RMI Para iniciar o registro no Windows: > start rmiregistry

9 Criando stubs e skeletons Uma classe stub oferece implementações dos métodos do serviço remoto que são invocadas no lado do cliente. Internamente, esses métodos empacotam (marshall) os argumentos para o método e os envia ao servidor A implementação correspondente no lado servidor, no skeleton, desempacota (unmarshall) os dados e invoca o método do serviço Obtido o valor de retorno do serviço, o servidor empacota e envia esse valor para o método no stub, que ainda estava aguardando esse retorno. Obtido o valor de retorno no stub, esse é desempacotado e retornado à aplicação cliente como resultado da invocação remota O processo de marshalling utiliza o mecanismo de serialização de Java Argumentos e valores de retorno de métodos remotos invocados através de RMI estão restritos a tipos primitivos de Java e a objetos de classes que implementam Serializable > javac Count.java > javac CountImpl.java Com a classe CountImpl.class disponível, a execução do comando > rmic CountImpl Gera as classes CountImpl_Stub.class e CountImpl_Skel.class, correspondendo respectivamente ao stub e ao skeleton para o serviço

10 Clientes RMI A principal etapa no desenvolvimento de uma aplicação cliente RMI é a obtenção da referência remota para o objeto (remoto) que implementa o serviço desejado O cliente RMI usa o serviço padrão oferecido pelo mecanismo de registro de nomes de serviços Uma vez que a referência remota seja obtida, ela pode ser convertida (downcast) para uma referência para a interface que especifica o serviço Os métodos oferecidos pelo serviço remoto são invocados da mesma forma que ocorre para objetos locais import java.rmi.registry.*; public class CountReset { public static void main(String args[]) { try { // Localiza o serviço pelo nome através do rmiregistry Count myCount = (Count) Naming.lookup(Count001); // Realiza operações com objeto remoto myCount.reset(); } catch(Exception e) { e.printStackTrace(); } System.exit(0); }

11 Politica de Segurança RMI Para permitir que o cliente se conecte com o registro do RMI e com o objeto do servidor, deve ser criado um arquivo de política Arquivo cliente.policy Para executar o programa cliente, especificar o arquivo de política: grant { permission java.net.SocketPermission *: , connect; }; > java –Djava.security.policy=client.policy CountReset

12 Observações Importantes Os métodos remotos podem receber e retornar objetos Estes objetos devem implementar a interface Serializable Tipos primitivos são passados por valor e objetos por referência nas chamadas dos métodos O cliente chama o método remoto usando um Stub O Stub então envia uma mensagem para o Skeleton na máquina remota, contento os argumentos da chamada ao método remoto O Skeleton empacota a resposta e envia ela de volta para o stub na máquina do cliente

13 Descrição do Fluxo RMI

14 Comparações SocketRMI TransporteUDP / TCPJRMP Descrição do ServiçoNão existeJava Interface LocalizaçãoConhece endereçoRMI Naming Service Look Up matchingNão existeExact String Match Remote referenceSocketProxy object SynchronicitySynchronous Garbage CollectionNão existe Language paradigmStreamsMethod call

15 Processo de Criação da Aplicação Compilar os arquivos das classes interface, implementação, cliente e servidor Javac *.java Gerar o stub/skeleton Rmic Ativação do serviço de nomes Start rmiregistry Inicie o servidor Start java server Excutar o cliente Java –Djava.security.policy=client.policy Cliente

16 Envio de Mensagens para um servidor Interface: ServidorInt.java Servidor: Servidor.java Cliente: Cliente.java

17 ServidorInt.java import java.rmi.*; public interface ServidorInt extends Remote{ void imprimeMensagem(String mensagem) throws RemoteException; }

18 Servidor.java import java.rmi.*; import java.rmi.server.*; import sun.rmi.registry.RegistryImpl; public class Servidor extends UnicastRemoteObject implements ServidorInt { public Servidor() throws RemoteException { super(); RegistryImpl impl = new RegistryImpl(1099); } public void imprimeMensagem(String mensagem) { System.out.println("A mensagem enviada foi : " + mensagem); } public static void main(String args[]) { try { Servidor s = new Servidor(); Naming.rebind("servidor", s); System.out.println("Servidor Registrado"); } catch (Exception e) { System.out.println("Erro : Mensagem : " + e.getMessage()); e.printStackTrace(); }

19 Cliente.java import java.rmi.*; import java.io.*; public class Cliente implements Serializable { public static void main(String args[]) { try { ServidorInt s = (ServidorInt) Naming.lookup("servidor"); s.imprimeMensagem(Hello CIn!"); } catch (Exception e) { System.out.println("Erro: Mensagem: " + e.getMessage()); e.printStackTrace(); }


Carregar ppt "Ronaldo Celso Messias Correia Invocação de Métodos Remotos RMI (Remote Method Invocation)"

Apresentações semelhantes


Anúncios Google