Title: PROGRAMA
1PROGRAMAÇÃO DISTRIBUÍDA EM JAVA
- Unidade 5
- Objetos Distribuídos RMIRemote Method Invocation
1
2Tópicos de Aula
- Problema da chamada remota de métodos
- Tecnologia RMI
- Interfaces para métodos remotos
- Stubs e Skeletons
- Registros de objetos remotos
3Chamada remota de métodos
Servidor remoto
Cliente
class ... String hello() ...
PROCESSO
Chamada remota
4Arquiteturas para chamada remota
- RPC ( Remote Procedure Call)
- CORBA ( Common Object Request Broker Architeture)
- JAVA RMI ( Remote Method Invocation )
5RPC (I)
- Estes procedimentos, normalmente, envolvem
serviços disponibilizados em redes. - RPC é muito utilizado em sistemasoperacionais
distribuídos para chamada remota de
procedimentos. -
6RPC (II)
- RPC não precisa, necessariamente, envolver
estruturação em termos de objetos. - Tanto o cliente quanto o servidor necessitam
de um Runtime para processamento da RPC. - Existe a necessidade de se trabalhar com
interfaces remotas denominadas STUBS.
7CORBA (I)
- CORBA é uma arquitetura para acesso a objetos
distribuídos que prima pela independência da
plataforma. - A especificação CORBA define, por exemplo,
tipos de dados que podem ser mapeados para várias
linguagem de programação, como C e Java.
8CORBA (II)
- Um ponto-chave em CORBA é a utilização de uma
IDL (Linguagem de Definição de Interface). Várias
linguagens (inclusive Java) já disponibilizam
mecanismos para mapeamento de IDL.
9CORBA (III)
- CORBA exige uma espécie de servidor
especializado chamado ORB (Object Request
Broker). Existem alguns ORBs comerciais, tal
como VisiBroker.
10Java RMI
- Arquitetura de acesso a objetos distribuídos
suportada pela linguagem Java. - Em termos de complexidade de programação e
ambiente, é muito simples construir aplicações
RMI, comparando-se com RPC e CORBA.
11Java RMI
- Em termos de ambiente, exige somente suporte
TCP/IP e um serviço de nomes de objetos
(rmiregistry), disponilizado gratuitamente com o
JDK/SDK.
12Arquitetura Java RMI
-
- Na realidade, o RMI é uma interface que
permite a intercomunicação entre objetos Java
localizados em diferentes hosts. -
13Arquitetura Java RMI
- Cada objeto remoto implementa uma interface
remota que especifica quais de seus métodos podem
ser invocados remotamente pelos clientes. - Os clientes invocam tais métodos exatamente como
invocam métodos locais.
14Modelo de Camadas do RMI
15Interfaces para métodos remotos(I)
- A definição do serviço remoto é feita através
de uma interface Java.
16Interfaces para métodos remotos(II)
- O primeiro passo para disponibilizar métodos
que possam ser invocados remotamente consiste na
preparação de uma interface remota com tais
métodos. -
17Interfaces para métodos remotos(III)
- A construção desta interface pode ser feita com
base na extensão da interface Remote do pacote
java.rmi.
18Interfaces para métodos remotos(IV)
- A arquitetura RMI suporta duas classes
implementando a mesma interface - Uma, que implementa o serviço e é interpretada
no servidor. - Outra, que age como um mecanismo de proxy e é
interpretada no cliente.
19Interfaces para métodos remotos(V)
- Um cliente faz chamadas de métodos ao objeto
proxy, RMI envia a requisição à JVM remota, que
executa o método.
20Interfaces para métodos remotos(V)
- Valores retornados pelo serviço remoto são
enviados, inicialmente, ao objeto proxy, que os
repassa para a aplicação cliente. - Vários servidores podem implementar de maneira
diferente a mesma interface de acesso ao serviço.
21Exemplo
- Suponha que se queira deixar um método chamado
sayHello(), que devolve uma String,
disponibilizado para chamada remota. - import java.rmi.
- public interface Hello
- extends Remote
- public String sayHello()
- throws RemoteException
-
22Implementação do método remoto
- Cada classe que queira disponibilizar tal
método remoto precisa implementar a interface
especificada anteriormente. Além disto, a
classe precisa extender a classe
UnicastRemoteObject, que é uma especialização de
um servidor remoto ( classe RemoteServer).
23Exemplo
- import java.rmi.
- import java.rmi.server.
- import java.net.
- public class servidor
- extends UnicastRemoteObject
- implements Hello
-
- public servidor() throws RemoteException //
Construtor - super()
-
- public String sayHello() throws
RemoteException // Método remoto - return(Oi cliente)
-
24Exemplo ( Continuação )
- public static void main(String args)
- try
- servidor servnew servidor()
- Naming.rebind(ServidorHello,serv) //
Registra nome do servidor - System.out.println(Servidor remoto
pronto.) -
- catch(RemoteException e)
- System.out.println(Exceção remotae)
-
- catch(MalformedURLException e)
-
-
- A partir deste ponto, o objeto chamado
ServidorHello está apto a aceitar chamadas
remotas. -
25Compilação e execução do servidor
- Não basta apenas compilar e executar o programa
anterior. Toda a compilação e execução necessita
de um ambiente dado pela seguinte seqüência - 1. Compilar o arquivo .java
- 2. Chamar o aplicativo rmic para gerar o Stub e
Skel - 3. Ativar o controlador de registros
(rmiregistry) - 4. Chamar o interpretador com o servidor
compilado
26Stubs e Skeletons
-
- O cliente, quando invoca remotamente um
método, não conversa diretamente com o objeto
remoto, mas com uma implementação da interface
remota chamada stub, que é enviada ao cliente. -
27Stubs e Skeletons
- O stub, por sua vez, passa a invocação para a
camada de referência remota. - Esta invocação é passada para um skeleton
(esqueleto), que se comunica com o programa
servidor.
28Compilação do exemplo anterior
servidor.java
javac
servidor.class
rmic
servidor_Stub.class
servidor_Skel.class
29Execução do servidor
-
- O primeiro passo antes de executar o servidor
é ativar uma espécie de servidor de nomes de
servidores que atendem solicitações de métodos
remotos. -
30Execução do servidor
- Isto é feito chamando-se o programa rmiregistry.
Este programa pode estar ouvindo portas
específicas, como por exemplo - rmiregistry 2048
-
31Execução do servidor
- Uma vez que este programa está executando,
pode-se chamar o interpretador java para o
arquivo servidor.class .
32Programação do cliente
- O primeiro passo de implementação de um
cliente que quer invocar remotamente método é
obter o stub do servidor remoto. - A localização deste stub é feita com o método
lookup(endereço). - Este método devolve uma referência remota do
objeto, através do envio do stub.
33Exemplo
- import java.rmi.
- class cliente
- public static void main(String args)
- try
- Servidor serv (Servidor) Naming.lookup(rmi//
ime.usp.br2048 /ServidorHello) - String retornoserv.sayHello()
-
- catch(Exception e)
-
-
-
34Esquema da chamada
ime.usp.br
lookup(.../Servidor)
cliente
Registry
Servidor está aqui
Solicitação de stub
Servidor_Stub.class
Stub
Stub
sayHello()
Servidor_Skel.class
Oi cliente
Servidor..class
35Exemplo II ( Calculadora)
- Interface
- public interface Calculator
- extends java.rmi.Remote
- public long add(long a, long b)
- throws java.rmi.RemoteException
- public long sub(long a, long b)
- throws java.rmi.RemoteException
- public long mul(long a, long b)
- throws java.rmi.RemoteException
- public long div(long a, long b)
- throws java.rmi.RemoteException
-
36Exemplo II ( Calculadora)
- Implementação dos métodos
- public class CalculatorImpl
- extends java.rmi.server.UnicastRemoteObje
ct - implements Calculator
- public CalculatorImpl()
- throws java.rmi.RemoteException
- super()
-
- public long add(long a, long b)
- throws java.rmi.RemoteException
- return a b
-
37Exemplo II ( Calculadora)
- Implementação dos métodos(II)
-
- public long sub(long a, long b)
- throws java.rmi.RemoteException
- return a - b
-
- public long mul(long a, long b)
- throws java.rmi.RemoteException
- return a b
-
- public long div(long a, long b)
- throws java.rmi.RemoteException
- return a / b
-
-
38Exemplo II ( Calculadora)
- Servidor
-
- import java.rmi.Naming
- public class CalculatorServer
- public CalculatorServer()
- try
- Calculator c new CalculatorImpl()
- Naming.rebind(" rmi//jaca.ime.usp.br1
099/ CalculatorService", c) - catch (Exception e)
- System.out.println("Trouble " e)
-
-
- public static void main(String args)
- new CalculatorServer()
-
-
39Exemplo II ( Calculadora)
- Cliente
-
- import java.rmi.Naming
- public class CalculatorClient
- public static void main(String args)
- try
- Calculator c
- (Calculator) Naming.lookup(
"rmi//jaca.ime.usp.br1099/CalculatorService") - System.out.println( c.sub(4, 3) )
- System.out.println( c.add(4, 5) )
- System.out.println( c.mul(3, 6) )
- System.out.println( c.div(9, 3) )
-
- catch (Exception e)
- System.out.println(e)
-
-
-
40Passagem de parâmetros
- Quando se passa um parâmetro para um método
remoto, pode ocorrer duas situações - Tipos primitivos RMI faz uma cópia do
parâmetro e a envia para o servidor. - Objetos RMI utiliza o mecanismo de
serialização para enviar uma cópia do objeto para
o servidor .