0% acharam este documento útil (0 voto)
4 visualizações34 páginas

Java RMI: Chamada Remota de Métodos

fator rmi unilab tecnova

Enviado por

bolsapicjgbl
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações34 páginas

Java RMI: Chamada Remota de Métodos

fator rmi unilab tecnova

Enviado por

bolsapicjgbl
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

PROGRAMAÇÃO

DISTRIBUÍDA EM JAVA
Verão/2001

Aula 06
Objetos distribuídos I: RMI

05.02.2001
Luciano Silva
e-mail: lucianos@[Link]
1
2

Tópicos da Aula 06
▪ Problema da chamada remota de métodos
▪ Tecnologia RMI
▪ Interfaces para métodos remotos
▪ Stubs e esqueletos
▪ Registros de métodos remotos
3

Chamada remota de métodos


Cliente Servidor remoto

class ...{
String hello(){
PROCESSO Chamada remota ...
}
}
4

Arquiteturas para chamada remota

Existem algumas arquiteturas destinadas para


chamada remota de métodos:

▪ RPC ( Remote Procedure Call)


▪ CORBA ( Common Object Request Broker
Architeture)
▪ JAVA RMI ( Remote Method Invocation )
5

RPC (I)

Serviço muito utilizado em sistemas


operacionais distribuídos para chamada
remota de procedimentos.
Estes procedimentos, normalmente, envolvem
serviços disponibilizados em redes, tais
como acesso a DNS, gerencimento remoto,
etc.
6

RPC (II)

RPC não precisa, necessariamente, envolver


estruturação em termos de objetos.
Como em CORBA e RMI, existe a
necessidade de se trabalhar com interfaces
remotas denominadas STUBS. Tanto o
cliente quanto o servidor necessitam de um
Runtime para processamento da RPC.
7

CORBA (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++, Pascal e Java.
8

CORBA (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.
CORBA exige uma espécie de “servidor”
especializado chamado ORB (Object Request
Broker). Existem alguns ORB´s comerciais, tais
como VisiBroker e Orbix.
9

Java 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.
Em termos de ambiente, exige somente suporte
TCP/IP e um serviço de nomes de objetos
(rmiregistry), disponilizado gratuitamente com o
JDK/SDK.
10

Arquitetura Java RMI


Na realidade, o RMI é uma interface que permite a
intercomunicação entre objetos Java localizados
em diferentes hosts. 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.
11

Modelo de camadas do RMI


12

Interfaces para métodos remotos(I)

A definição do serviço remoto é feita através


de uma interface Java.
13

Interfaces 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.

A construção desta interface pode ser feita


com base na extensão da interface Remote
do pacote [Link].
14

Interfaces para métodos remotos(III)

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
15

Interfaces para métodos remotos(IV)


Um cliente faz chamadas de métodos ao objeto
proxy, RMI envia a requisição à JVM remota, que
executa o método.
16

Interfaces 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.
17

Exemplo

Suponha que se queira deixar um método chamado


sayHello(), que devolve uma String, disponibilizado
para chamada remota.

import [Link].*;
public interface Hello
extends Remote{
public String sayHello()
throws RemoteException;
}
18

Implementaçã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).
19

Exemplo
import [Link].*;
import [Link].*;
import [Link].*;

public class servidor


extends UnicastRemoteObject
implements Hello{

public servidor() throws RemoteException{ // Construtor


super();
}
public String sayHello() throws RemoteException{ // Método remoto
return(“Oi cliente”);
}
20

Exemplo ( Continuação )
public static void main(String args[]){
try{
servidor serv=new servidor();
[Link](“ServidorHello”,serv); // Registra nome do servidor
[Link](“Servidor remoto pronto.”);
}
catch(RemoteException e){
[Link](“Exceção remota:”+e);
}
catch(MalformedURLException e){};
}
}
A partir deste ponto, o objeto chamado ServidorHello
está apto a aceitar chamadas remotas.
21

Compilaçã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
22

Stubs e Skels

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. O stub, por sua vez, passa a
invocação para a camada de referência remota.
Esta invocação é passada para um skel
(esqueleto) , que se comunica com o programa
servidor.
23

Compilação do exemplo anterior


[Link]

javac

[Link]

rmic

servidor_Stub.class servidor_Skel.class
24

Execuçã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. Isto é feito chamando-se o programa
rmiregistry. Este programa pode estar ouvindo
portas específicas, como por exemplo:
% rmiregistry 2048 &
Uma vez que este programa está executando, pode-
se chamar o interpretador java para o arquivo
[Link] .
25

Programaçã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.
26

Exemplo
import [Link].*;

class cliente{

public static void main(String args[]){


try{
Servidor serv= (Servidor) [Link](“rmi://[Link]
/ServidorHello”);
String retorno=[Link]();
}
catch(Exception e);
}
}
27

Esquema da chamada
[Link]
lookup(.../Servidor)
cliente Registry
Servidor está aqui

Solicitação de stub

Servidor_Stub.class
Stub

Stub sayHello()

Servidor_Skel.class

“Oi cliente” Servidor..class


28

Exemplo II ( Calculadora)

Interface

public interface Calculator


extends [Link] {
public long add(long a, long b)
throws [Link];
public long sub(long a, long b)
throws [Link];
public long mul(long a, long b)
throws [Link];
public long div(long a, long b)
throws [Link];
}
29

Exemplo II ( Calculadora)

Implementação dos métodos

public class CalculatorImpl


extends [Link]
implements Calculator {
public CalculatorImpl()
throws [Link] {
super();
}
public long add(long a, long b)
throws [Link] {
return a + b;
}
30

Exemplo II ( Calculadora)

Implementação dos métodos(II)


public long sub(long a, long b)
throws [Link] {
return a - b;
}
public long mul(long a, long b)
throws [Link] {
return a * b;
}
public long div(long a, long b)
throws [Link] {
return a / b;
}
}
31

Exemplo II ( Calculadora)

Servidor
import [Link];

public class CalculatorServer {


public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
[Link](" rmi://[Link]/ CalculatorService", c);
} catch (Exception e) {
[Link]("Trouble: " + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}
}
32

Exemplo II ( Calculadora)

Cliente
import [Link];

public class CalculatorClient {


public static void main(String[] args) {
try {
Calculator c =
(Calculator) [Link]( "rmi://[Link]/CalculatorService");
[Link]( [Link](4, 3) );
[Link]( [Link](4, 5) );
[Link]( [Link](3, 6) );
[Link]( [Link](9, 3) );
}
catch (Exception e) {
[Link](e);
}
}
}
33

Passagem 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
34

Funcionalidades adicionais do RMI

▪ É possível substituição dinâmica da


interface remota enviada ao cliente
▪ É possível o servidor invocar, remotamente,
algum serviço do cliente sem que o cliente
estenda diretamente a classe
[Link].

Você também pode gostar