RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI)...

Post on 07-Apr-2016

242 views 1 download

Transcript of RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI)...

RMI Java

Remote Method Invocation em Java

Introdução Java Remote Method Invocation

(Java RMI) permite desenvolver sistemas distribuídos baseados em Java.

RMI usa serialização de objetos para encapsular e desencapsular parâmetros suportando polimorfismo.

Interface Remota Um objeto remoto é uma instância de uma classe

que implementa uma interface remota. A interface remota declara cada um dos métodos

que podem ser chamados remotamente. A interface remota dever ser declarada como

“public”. Ela deve extender a interface “java.rmi.Remote”. Cada método deve declarar

“java.rmi.RemoteException” na sua cláusula “throws”.

O tipo de dado de qualquer objeto remoto que é passado como um argumento ou retornado deve ser declarado.

Exemplo: package examples.hello;

import java.rmi.Remote; import java.rmi.RemoteException;

public interface Hello extends Remote {String sayHello() throws RemoteException;

}

Objeto Remoto Declara que implementa uma interface

remota. Implementação de seu construtor. Implementação do método que pode ser

chamado remotamente. Uma classe “servidor”, que tem um método

principal que cria uma instância do objeto remoto e que registra o objeto no serviço de nomes “rmiregistry”. A classe que implementa o método main pode ser a própria classe do objeto.

Implementando uma Interface Remota A classe promete que irá prover o corpo

dos métodos para cada um das assinaturas declaradas na interface. Os métodos são publicos ou abstratos.

Exemplo de uma declaração:public class HelloImpl extends

UnicastRemoteObject implements Hello {

Definir um construtor Mesmas funções de um construtor

normal; Exportação do objeto:

UnicastRemoteObject.exportObject a partir do construtor da classe;

Construtor throws “remoteException

Exemplo public HelloImpl() throws RemoteException {

super(); } O método super invoca o construtor de

java.rmi.server.UnicastRemoteObject, que exporta o objeto remoto.

O construtor usa java.rmi.RemoteException, pois pode ocorrer uma falha durante a exportação do objeto.

Prover implementação métodos Todos os métodos que constam na

Interface remota devem ser implementados:

public String sayHello() throws RemoteException { return "Hello World!";

} Obs: java.io.Serializable

O gerenciador de segurança O “servidor” deverá instalar um

geranciador de segurança:if (System.getSecurityManager() == null)

{ System.setSecurityManager(new RMISecurityManager());

} Garante que as classes carregadas

não vão realizar operações indesejadas.

Criando instâncias do objeto remoto

HelloImpl obj = new HelloImpl();

Depois de criado ele está pronto para receber chamadas remotas.

Registrar o objeto Para puder utilizar um objeto remoto o

cliente deverá obter sua referência RMI prover um “Registry” que permite

publicar o objeto através de um endereço no formato "//host/objectname“ (serviço de nomes)

Exemplo:Naming.rebind("//myhost/HelloServer", obj);

Exemplo Servidorpackage examples.hello;

import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.RMISecurityManager;import java.rmi.server.UnicastRemoteObject;public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException {super(); } public String sayHello() {return "Hello World!"; }

Exemplo Servidor (continuação)

public static void main(String args[]) {// Create and install a security managerif (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager());}try { HelloImpl obj = new HelloImpl(); // Bind this object instance to the name "HelloServer" Naming.rebind("//myhost/HelloServer", obj); System.out.println("HelloServer bound in registry");} catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace();} }}

Localizando o objeto O cliente utiliza o serviço provido

pelo Registry para localizar o objeto.

Exemplo:

obj = (Hello) Naming.lookup("//hostname/HelloServer");

Exemplo de um clientepackage examples.hello;import java.applet.Applet;import java.awt.Graphics;import java.rmi.Naming;import java.rmi.RemoteException;public class HelloApplet extends

Applet { String message = "blank"; Hello obj = null; public void init() {

try { obj = (Hello)Naming.lookup("//" + getCodeBase().getHost() + "/HelloServer"); message = obj.sayHello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getMessage()); e.printStackTrace(); } } public void paint(Graphics g) { g.drawString(message, 25, 50); } }

Compilar as classes Verificar CLASSPATH Compilar os códigos fontes:

javac -d $HOME/public_html/myclasses Hello.java HelloImpl.java HelloApplet.java

Gerando Stubs e Skeletons Rmic – cria os stubs e os skeletons. Cria arquivos de classes nos formatos:

MyImpl_Skel.class MyImpl_Stub.class

Exemplo:rmic -d $HOME/public_html/myclasses

examples.hello.HelloImpl -d indica o diretório raiz das classes

Iniciando o “registry”

rmiregistry &

start rmiregistry

start rmiregistry 2001

Iniciando o Servidorjava

-Djava.rmi.server.codebase=http://myhost/~myusrname/myclasses/ -Djava.security.policy=$HOME/mysrc/policy examples.hello.HelloImpl

Onde: -Djava.rmi.server.codebase=http://myhost/~myusrname/

myclasses/ - determina a localização dos stubs e skeletons

-Djava.security.policy=$HOME/mysrc/policy – fornece a localização do arquivo com a política de segurança

Atividade Elaborar no laboratório um Servidor

simples e um Cliente utilizando o RMI Java como suporte para a comunicação:

http://java.sun.com/j2se/1.4.2/docs/guide/rmi/index.html

FIM