Informações
| Tipo: | Artigo |
|---|---|
| Data de Publicação: | 01/01/2004 |
| Revisado em: | 01/01/2004 |
Vote!
Tags Relacionadas
Comentários ( 1 )
Imprimir
Java Remote Method Protocol
por:
Gleydson Lima (gleydson@jeebrasil.com.br)
Java RMI é um mecanismo que permite que um objeto invocar um método que está em outro espaço de endereçamento. Esse outro espaço de endereçamento pode ser na mesma máquina ou em uma máquina diferente. O RMI é um mecanismo de RPC (Remote Procedure Call) para programação orientada a objetos.
Introdução
Java RMI é um mecanismo que permite que um objeto invocar um método que está em outro espaço de endereçamento. Esse outro espaço de endereçamento pode ser na mesma máquina ou em uma máquina diferente. O RMI é um mecanismo de RPC (Remote Procedure Call) para programação orientada a objetos. CORBA é outro mecanismo de RPC para programação orientada a objetos, porém, difere do RMI em alguns aspectos, dentre eles:
- CORBA é independente de linguagem
- CORBA inclui muitos outros serviços que podem ser acessar pelos objetos (como transações, segurança) que não fazem parte do RMI.
- Não existe a noção de "Object Request Broker (ORB)" em RMI.
RMI tem se tornado recentemente compatível com CORBA. Na realidade existe uma nova implementação de RMI sobre IIOP chamada RMI/IIOP que usa o protocolo IIOP(Internet Inter-ORB Protocol) como background na comunicação do RMI.
Em RMI existem dois tipos de classes que podem ser usadas.
1. Uma classe Remota que a instância é usada remotamente. Um objeto de uma classe pode ser referenciado de duas maneiras diferentes:
1.1. Dentro do mesmo espaço de endereçamento onde o objeto foi construído. Essa é a forma tradicional e seu uso é igual a qualquer objeto.
1.2. Dentro de outro espaço de endereçamento, onde o objeto é referenciado usando um Object Handle. Dessa forma, o Object Handle é uma referencia remota do objeto que está em outro espaço de endereçamento.
2. Objetos Serializáveis que são passados como parâmetros (ou retorno) de uma invocação de método. Dessa forma o estado do objeto é copiado de um espaço de endereçamento para outro. Se um objeto remoto é passado como parâmetro (ou retorno) o Object Handle é copiado de um espaço de endereçamento para outro.
Comunicação de Objetos Distribuídos
Quando dois objetos em espaços de endereçamento diferentes se comunicam precisamos de intermediários que realizem essa comunicação, são eles o Stub e Skeleton. O gráfico abaixo mostra o processo de comunicação.
O objeto A não conhece a implementação do objeto B, apenas uma interface remota. A interface Remota define quais métodos podem ser chamados remotamente. Tanto o objeto B quanto o Stub implementam a interface Remota. Assim, a seqüência de passos para realizar a chamada é a seguinte:
- O objeto A faz a chamada do método desejado no Stub
- O Stub converte a chamada em protocolo RMI e envia pela Rede
- A requisição é enviada pela rede
- O Skeleton recebe a requisição em RMI e reconhece qual método deve ser chamado.
- Chama o método desejado no Objeto B.
- Recebe o retorno do método
- Envia a o objeto de Retorno para o Cliente
- O Stub recebe o retorno
- O Stub repassa o retorno para o Objeto A.
Esse é o processo que permite que o objeto A se comunique com o objeto B mesmo eles estando em máquinas diferentes. Os stubs e skeletons são objetos gerados automaticamente por alguma ferramenta. Sem a inestimável ajuda deles, não seria possível essa comunicação.
Vamos ver um exemplo de um HelloWorld distribuído.
package servidor;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloRemote extends java.rmi.Remote {
public String say() throws RemoteException;
}
Interface Remota
package servidor;
import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloRemote {
private String message;
public Hello (String msg) throws RemoteException {
message = msg;
}
public String say() throws RemoteException {
return message;
}
}
Implementação do Objeto
package servidor;
import java.rmi.*;
public class Server {
public static void main (String[] argv) {
try {
Naming.rebind ("Hello", new Hello ("Hello, world!"));
System. out.println ("Hello Servidor está funcionando");
}
catch (Exception e) {
System.out.println ("Hello Server failed: " + e);
e.printStackTrace();
}
}
}
Servidor
Na definição da interface remota estão quais métodos do objeto que serão chamados remotamente pelo Cliente. A implementação do objeto contém a lógica de negócio da interface.
A classe Server é responsável por colocar o objeto no registro (local por onde você irá procurar pelos objetos). A colocação do objeto no registro é feita dando-se um nome para ele, no caso Hello.
Agora precisamos gerar os Stubs e Skeletons. Para isso, usamos uma ferramenta denominada rmic. Essa ferramenta faz a geração das classes Stubs e Skeletons. Procedemos a geração através do comando:
rmic servidor.Hello
O resultado da execução dessa ferramenta será a geração das classes Hello_Stub e Hello_Skel.
O próximo passo é iniciar o processo que irá gerenciar a busca de objetos distribuídos, que é o rmiregistry. Para iniciá-lo digite rmiregistry no mesmo diretório que estão suas classes servidoras.
package cliente;
import java.rmi.*;
import servidor.HelloRemote;
public class Client {
public static void main(String[] argv) {
try {
HelloRemote hello = (HelloRemote) Naming.lookup("//localhost/Hello");
System.out.println(hello.say());
} catch (Exception e) {
System.out.println("HelloClient exception: " + e);
}
}
}
Codificando o cliente
O código Cliente faz a busca pelo objeto Hello localizado em localhost. O resultado dessa pesquisa é uma referencia remota do objeto. Logo depois é chamado o método say do objeto remoto hello e todo o processo mostrado na figura 1 é executado.
Baixe o exemplo [colocar o exemplo em zip]
Conclusões
RMI é importante no J2EE para entendermos como as coisas são feitas usando objetos distribuídos. Os componentes EJB usam RMI ou RMI/IIOP como base da sua comunicação.
Comentários (1)
- Muito boa a explicação, curta, objetiva e exemplificativa sem rodeios; obrigado!
- postado por laercio em 12/03/2007 às 23:21
