RMI Java Remote Method Invocation em Java
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