Desenvolvimento
  • JAVA
  • Java
    • Integração Java e C++ com JNI
    • Objetos Distribuídos com RMI
    • Teclas de Atalho do Eclipse
    • Apache Maven Framework
    • Hibernate Framework
      • @OneToMany Relacionamento 1:N
      • @ManyToOne Relacionamento N:1
  • WebServices
    • Web Services e Arquitetura Orientada a Serviços
    • Gerando Web Services PHP com NuSoap
    • Enviando uma Requisição SOAP a um Serviço
    • Web Services com Spring e Apache CXF
    • Web Services com JAX-WS
  • Microservices
    • Introdução à Microservices
  • Design Patterns Java
    • Design Patterns
  • Documentações Oficiais
  • Apache Maven
  • Apache Struts
  • Docker Hub
  • Maven Repository
  • Spring Framework
Powered by GitBook
On this page

Was this helpful?

  1. Java

Objetos Distribuídos com RMI

Remote Method Invocation (RMI)

PreviousIntegração Java e C++ com JNINextTeclas de Atalho do Eclipse

Last updated 4 years ago

Was this helpful?

O RMI é uma extensão de software à máquina virtual Java remota (JVM) que permite o envio de mensagens para objetos gerenciados por outra JVM. O RMI propicia uma implementação natural do sistema distribuído em um ambiente Orientados a Objeto.

Objetos de uma determinada máquina poderão enviar mensagens através da rede para objetos presentes em outra máquina.

Implementação da Tecnologia

A partir deste momento vamos chamar de “receptor” ao local onde está o objeto que recebe as mensagens remotas e “transmissor” ao local de onde partem as mensagens remotas.

Quando pensamos em uma aplicação cliente-servidor, é comum que no programa servidor haja objetos receptores. Entretanto, é possível que haja uma situação em que objetos do programa cliente também sejam receptores; ou seja, que recebam mensagens vindas do programa servidor.

Assim, a especificação destes passos se refere aos objetos que recebem as mensagens remotas; estes podem estar no programa servidor ou no programa cliente.

Para cada classe que receber mensagens remotas (receptor), criar uma interface que contenha a especificação destes métodos.

A interface deverá ser especialização da interface Remote.

Os métodos deverão indicar que throws RemoteException (ou seja, podem disparar a exceção RemoteException).

Aplicação Servidor

Na aplicação servidor defino uma interface estendendo a classe Remote do pacote java.rmi.*.

package br.com.rmi.control;

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

public interface IRmiServidorExemplo extends Remote{

	public String exibirMensagem(String txt) throws RemoteException;
	public Double somar(Double x, Double y) throws RemoteException;

}

Logo após crio a classe com a implementação dos métodos de nossa aplicação servidora. A Classe de Implementação dos métodos deve estender UnicastRemoteObject e implementar a interface do Servidor.

package br.com.rmi.control;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

@SuppressWarnings("serial")
public class RmiServidorExemplo extends UnicastRemoteObject implements IRmiServidorExemplo{

	protected RmiServidorExemplo() throws RemoteException {
		super();

	}

	@Override
	public String exibirMensagem(String txt) throws RemoteException {
		return "Retorno RMI : "+ txt;
	}
	@Override
	public Double somar(Double x, Double y) throws RemoteException {		
		return x+y;
	}

}

Por fim implementamos a classe responsável por publicar o Servidor RMI.

package br.com.rmi.control;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class RmiServidor {

	public static void main(String[] args) throws Exception{

		// PORTA PADRÃO DO RMI 1099
		LocateRegistry.createRegistry(1099);

		// Instancia o Objeto do Servidor Remoto
		RmiServidorExemplo serv = new RmiServidorExemplo();

                // Vincula um nome para o objeto Remoto
		Naming.bind("RmiServidor", serv);
		System.out.println("RmiServidor Conectado !!!");
	}
}

Aplicação Cliente

Na aplicação cliente uso a mesma interface definida na aplicação servidor para estabelecer um contrato de comunicação entre as duas partes.

package br.com.rmi.control;

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

public interface IRmiServidorExemplo extends Remote{

	public String exibirMensagem(String txt) throws RemoteException;
	public Double somar(Double x, Double y) throws RemoteException;

}

Por fim acesso a aplicação rmi através da Url: rmi://localhost/RmiServidor, onde RmiServidor foi o nome vinculado ao objeto Remoto, e assim consigo acessar aos métodos do meu objeto remoto.

package br.com.rmi.view;
import java.rmi.Naming;
import br.com.rmi.control.IRmiServidorExemplo;

public class ProgramaClienteRMI {

public static void main(String[] args) throws Exception{

		String urlServidor = "rmi://localhost/RmiServidor";
		IRmiServidorExemplo serv = (IRmiServidorExemplo)Naming.lookup(urlServidor);

		System.out.println(serv.exibirMensagem("Olá Mundo RMI !!!"));
		System.out.println(serv.somar(20.89, 38.25));								

	}
}
RMI