Comunicação remota por mola com RMI

Comunicação remota por mola com RMI

1. Visão geral

JavaRemote Method Invocation permite invocar um objeto que reside em umJava Virtual Machine diferente. É uma tecnologia bem estabelecida, mas um pouco complicada de usar, como podemos ver noofficial Oracle trail dedicado ao assunto.

Neste artigo rápido, vamos explorar comoSpring Remoting permite alavancarRMI de uma maneira mais fácil e limpa.

Este artigo também completa a visão geral deSpring Remoting. Você pode encontrar detalhes sobre outras tecnologias suportadas nas parcelas anteriores:HTTP Invokers,JMS,AMQP,Hessian, and Burlap.

2. Dependências do Maven

Como fizemos em nossos artigos anteriores, vamos configurar alguns aplicativosSpring Boot: um servidor que expõe o objeto de chamada remota e um cliente que invoca o serviço exposto.

Tudo o que precisamos está no jarspring-context - portanto, podemos trazê-lo usando qualquer auxiliarSpring Boot que preferirmos - porque nosso objetivo principal é apenas ter as principais bibliotecas disponíveis.

Vamos agora prosseguir com ospring-boot-starter-web usual - lembrando de remover a dependênciaTomcat para excluir o serviço da web incorporado:


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-tomcat
        
    

3. Aplicativo de servidor

Começaremos declarando uma interface que define um serviço para reservar uma corrida de táxi, que será eventualmente exposta aos clientes:

public interface CabBookingService {
    Booking bookRide(String pickUpLocation) throws BookingException;
}

Em seguida, definiremos um bean que implementa a interface. Este é o bean que realmente executará a lógica de negócios no servidor:

@Bean
CabBookingService bookingService() {
    return new CabBookingServiceImpl();
}

Vamos continuar declarando oExporter que disponibiliza o serviço aos clientes. Nesse caso, usaremos oRmiServiceExporter:

@Bean
RmiServiceExporter exporter(CabBookingService implementation) {
    Class serviceInterface = CabBookingService.class;
    RmiServiceExporter exporter = new RmiServiceExporter();
    exporter.setServiceInterface(serviceInterface);
    exporter.setService(implementation);
    exporter.setServiceName(serviceInterface.getSimpleName());
    exporter.setRegistryPort(1099);
    return exporter;
}

Por meio desetServiceInterface(), fornecemos uma referência à interface que poderá ser chamada remotamente.

Devemos também fornecer uma referência ao objeto que está executando o método comsetService(). Em seguida, poderíamos fornecer a porta doRMI registry disponível na máquina onde o servidor é executado, se não quisermos usar a porta padrão 1099.

Devemos também definir um nome de serviço, que permita identificar o serviço exposto no registroRMI.

Com a configuração fornecida, o cliente poderá contatarCabBookingService na seguinte URL:rmi://HOST:1199/CabBookingService.

Vamos finalmente iniciar o servidor. Nem mesmo precisamos iniciar o registro RMI por nós mesmos, porqueSpring fará isso automaticamente para nós se tal registro não estiver disponível.

4. Aplicativo Cliente

Vamos escrever agora o aplicativo cliente.

Começamos declarando oRmiProxyFactoryBean que criará um bean que possui a mesma interface exposta pelo serviço em execução no lado do servidor e que encaminhará de forma transparente as invocações que receberá para o servidor:

@Bean
RmiProxyFactoryBean service() {
    RmiProxyFactoryBean rmiProxyFactory = new RmiProxyFactoryBean();
    rmiProxyFactory.setServiceUrl("rmi://localhost:1099/CabBookingService");
    rmiProxyFactory.setServiceInterface(CabBookingService.class);
    return rmiProxyFactory;
}

Vamos então escrever um código simples que inicializa o aplicativo cliente e usa o proxy definido na etapa anterior:

public static void main(String[] args) throws BookingException {
    CabBookingService service = SpringApplication
      .run(RmiClient.class, args).getBean(CabBookingService.class);
    Booking bookingOutcome = service
      .bookRide("13 Seagate Blvd, Key Largo, FL 33037");
    System.out.println(bookingOutcome);
}

Agora é suficiente iniciar o cliente para verificar se ele chama o serviço exposto pelo servidor.

5. Conclusão

Neste tutorial, vimos como poderíamos usarSpring Remoting para facilitar o uso deRMI que, de outra forma, exigirá uma série de tarefas tediosas como, entre todas, girar um registro e definir serviços usando interfaces que tornam uso pesado de exceções verificadas.

Como de costume, você encontrará as fontesover on GitHub.