![Page 1: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/1.jpg)
T. D. S. I. PARA WEBT. D. S. I. PARA WEB
Prof. Emmanuel NolêtoProf. Emmanuel Nolêto
![Page 2: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/2.jpg)
Java RMIJava RMI
![Page 3: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/3.jpg)
Objetivos
• Permitir que um método de uma classe Java em execução em uma máquina virtual JVM chame um método de um objeto (instância de uma classe Java) situado em outra máquina virtual JVM, usando a mesma sintaxe e com a mesma facilidade de se chamar um método local.
• Transparência de acesso e de localização.
![Page 4: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/4.jpg)
Esquema geral
JVM cliente
método fda classe Cem execução
JVM servidor
método g
objeto daclasse S
chamadaremota
![Page 5: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/5.jpg)
Remote Method Invocation
• Facility to call methods remotely• Similar to RPC - Remote Procedure Call• High-level communication abstraction
• The RMI mechanism provides:• control transfer between caller and called• parameters cans be exchanged• class definitions can be exchanged
• RMI support in Java provides:• A specific API• compilation support tools• runtime support
![Page 6: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/6.jpg)
General scenario
Server
Registry
Client
StubSkeleton
communication
actual
perceived
get an object referenceobject
reference is published
naming service
2
1
3
![Page 7: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/7.jpg)
Componentes em execução
f de C g de S
S_SkelS_Stub
SocketCliente
SocketServidor
Naming
Naming
RegistrySocketCliente
SocketServidor
chamda remota de g
cliente servidor
main
cria
bind
lookup
![Page 8: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/8.jpg)
Hierarquia de classes e interfaces
Interface Remote Classe UnicastRemoteObject
Interface Rassinatura de g
Classe Simplementação de g
extends
implements
extends
![Page 9: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/9.jpg)
Compilação
S.java
javac
S.class
rmic
S_Skel.class S_Stub.class
C.java
javac
C.class
![Page 10: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/10.jpg)
Exemplo de RMI
• Definição das interfaces para os serviços remotos• Implementações dos serviços remotos• Arquivos de Stub e Skeletons• Um servidor para hospedar os serviços remotos• Um serviço de RMI Naming que permite o cliente
achar os serviços remotos• Um provedor de arquivos de classes (servidor http
ou ftp)• Um programa cliente que necessita os serviços
remotos
![Page 11: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/11.jpg)
Aplicativo com RMI
• Escrever e compilar o código Java da interface
• Escrever e compilar o código Java das implementações das classes
• Gerar as classes Stub e Skeleton das classes de implementação, criar um diretório para salvar todos os seus arquivos de projeto.
![Page 12: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/12.jpg)
Interfaces
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Mensageiro extends Remote {
public void enviarMensagem( String msg ) throws RemoteException;
public String lerMensagem() throws RemoteException;
}
![Page 13: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/13.jpg)
Interfaces
• O primeiro passo, como dito, será criar a interface e compilá-la. A interface define todas as funcionalidades remotas oferecidas pelo serviço. Nomeio o arquivo como: Mensageiro.java.
![Page 14: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/14.jpg)
Interfaces
• Perceba que esta interface estende a classe Remote, e cada assinatura de método declara as funcionalidades do serviço, e que podem gerar uma exceção RemoteException. Salve este arquivo (Mensageiro.java) no seu diretório e compile, com a seguinte linha de comando: – javac Mensageiro.java
![Page 15: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/15.jpg)
Implementação
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MensageiroImpl extends UnicastRemoteObject implements Mensageiro {
public MensageiroImpl() throws RemoteException {
super();
}
public void enviarMensagem( String msg ) throws RemoteException {
System.out.println( msg );
}
public String lerMensagem() throws RemoteException {
return "This is not a Hello World! message";
}
}
![Page 16: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/16.jpg)
Implementação
• Agora, você deverá escrever a implementação para o serviço remoto, ou seja, o código a ser executado no ambiente remoto. Nomeia o arquivo como: MensageiroImpl.java.
• Salve este arquivo (MensageiroImpl.java) no seu diretório e compile, com a seguinte linha de comando: – javac MensageiroImpl.java
![Page 17: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/17.jpg)
Implementação
• Observe que a classe se utiliza (estende) da classe UnicastRemoteObject para linkar com o sistema RMI. Neste exemplo a classe estende a classe UnicastRemoteObject diretamente. Isto não é realmente necessário, mas essa discusão fica para uma próxima etapa. Quando uma classe estende a classe UnicastRemoteObject, ele deve prover um construtor que declare que ele pode lançar uma exceção RemoteException, pois quando o método super( ) é chamado, ele ativa o código em UnicastRemoteObject, que executa o link RMI e a iniciação do objeto remoto.
• Stubs e Skeletons• Gere os arquivos Stubs e Skeletons da classe de implementação
que roda no servidor. Para tanto, execute o comando rmic, compilador RMI do JDK.
– rmic MensageiroImpl
![Page 18: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/18.jpg)
Implementação
import java.rmi.Naming;
public class MensageiroServer {
public MensageiroServer() {
try {
Mensageiro m = new MensageiroImpl();
Naming.rebind("rmi://localhost:1099/MensageiroService", m);
}
catch( Exception e ) {
System.out.println( "Trouble: " + e );
}
}
public static void main(String[] args) {
new MensageiroServer();
}
}
![Page 19: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/19.jpg)
Implementação
• Salve este arquivo (MensageiroServer.java) no seu diretório e compile, com a seguinte linha de comando: > javac MensageiroServer.java
• Cliente– O código fonte para o cliente é o seguinte.
Salve o arquivo como: MensageiroClient.java.
![Page 20: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/20.jpg)
Implementação
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.NotBoundException;
import java.net.MalformedURLException;
public class MensageiroClient {
public static void main( String args[] ) {
try {
Mensageiro m = (Mensageiro) Naming.lookup( "rmi://localhost/MensageiroService" ); System.out.println( m.lerMensagem() );
m.enviarMensagem( "Hello World!" );
}
catch( MalformedURLException e ) {
System.out.println();
![Page 21: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/21.jpg)
Implementação
System.out.println( "MalformedURLException: " + e.toString() );
}
catch( RemoteException e ) {
System.out.println();
System.out.println( "RemoteException: " + e.toString() );
}
catch( NotBoundException e ) {
System.out.println();
System.out.println( "NotBoundException: " + e.toString() );
}
catch( Exception e ) {
System.out.println();
System.out.println( "Exception: " + e.toString() );
}
}
}
![Page 22: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/22.jpg)
Implementação
• Salve este arquivo (MensageiroClient.java) no seu diretório e compile, com a seguinte linha de comando: – javac MensageiroClient.java
![Page 23: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/23.jpg)
Rodando o sistema RMI
• Agora que todos os arquivos do projeto de exemplo foram criados e devidamente compilados, estamos prontos para rodar o sistema! Você precisará abrir três diferentes consoles do MS-DOS no seu Windows, ou outro, caso utilize um diferente sistema operacional.
• Em um dos consoles vai rodar o programa servidor, no outro o cliente e no terceiro o RMI Registry. Inicie com o RMI Registry. Você deve estar no mesmo diretório em que estão gravados seus arquivos para rodar o aplicativo. Execute a seguinte linha de comando:– rmiregistry
![Page 24: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/24.jpg)
Rodando o sistema RMI
• Isso irá iniciar o RMI Registry e rodá-lo. No segundo console vamos executar o programa servidor. Você deve estar no mesmo diretório em que estão gravados seus arquivos para rodar o aplicativo. Execute o seguinte comando: – java MensageiroServer
![Page 25: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/25.jpg)
Rodando o sistema RMI
• Isso irá iniciar, carregar a implementação na memória e esperar pela conexão cliente. No último console, rode o programa cliente. Você deve estar no mesmo diretório em que estão gravados seus arquivos para rodar o aplicativo. Excute o comando: – java MensageiroClient
![Page 26: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/26.jpg)
• Se tudo correr bem, que é o que esperamos e o que deveria acontecer, a seguinte saída será gerada nos consoles 2 (servidor) e 3 (cliente). No console 2 (servidor): – Hellow World!
• No console 3 (cliente): – This is not a Hello World! message
Rodando o sistema RMI
![Page 27: T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc15e497959413d8e5d8c/html5/thumbnails/27.jpg)
Rodando sistema RMI
• É isso aí. Você acabou de criar um sistema utilizando a tecnologia RMI. Apesar de você ter rodado os programas na mesma máquina, o RMI usa a pilha de rede TCP/IP para se comunicar entre as três diferentes instâncias da JVM. Espero que tenham gostado e aprendido com esse pequeno exemplo de como se usar o RMI.