Remoting primaverile con RMI

1. Panoramica

Java Remote Method Invocation consente di richiamare un oggetto che risiede in una Java Virtual Machine diversa . È una tecnologia consolidata ma un po 'macchinosa da usare, come possiamo vedere nel percorso Oracle ufficiale dedicato all'argomento.

In questo rapido articolo, esploreremo come Spring Remoting consente di sfruttare RMI in modo più semplice e pulito.

Questo articolo completa anche la panoramica di Spring Remoting . Puoi trovare dettagli su altre tecnologie supportate nelle puntate precedenti: HTTP Invokers, JMS, AMQP, Hessian e Burlap.

2. Dipendenze di Maven

Come abbiamo fatto nei nostri articoli precedenti, configureremo un paio di applicazioni Spring Boot : un server che espone l'oggetto richiamabile remoto e un client che invoca il servizio esposto.

Tutto ciò di cui abbiamo bisogno è nel vaso del contesto di primavera, quindi possiamo portarlo usando qualsiasi helper di Spring Boot che preferiamo, perché il nostro obiettivo principale è solo quello di avere le librerie principali disponibili.

Andiamo ora avanti con il solito spring-boot-starter-web - ricordandoci di rimuovere la dipendenza Tomcat per escludere il servizio web incorporato:

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

3. Applicazione server

Inizieremo a dichiarare un'interfaccia che definisce un servizio per prenotare un passaggio su un taxi, che verrà eventualmente esposto ai clienti:

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

Quindi definiremo un bean che implementa l'interfaccia. Questo è il bean che eseguirà effettivamente la logica di business sul server:

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

Continuiamo a dichiarare l' Esportatore che rende il servizio disponibile ai clienti. In questo caso, useremo RmiServiceExporter :

@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; }

Tramite setServiceInterface () forniamo un riferimento all'interfaccia che verrà resa richiamabile da remoto.

Dovremmo anche fornire un riferimento all'oggetto che esegue effettivamente il metodo con setService () . Potremmo quindi fornire la porta del registro RMI disponibile sulla macchina su cui viene eseguito il server se non vogliamo utilizzare la porta predefinita 1099.

Dovremmo anche impostare un nome di servizio, che consenta di identificare il servizio esposto nel registro RMI .

Con la configurazione data il cliente potrà contattare il CabBookingService al seguente URL: rmi: // HOST: 1199 / CabBookingService .

Iniziamo finalmente il server. Non abbiamo nemmeno bisogno di avviare il registro RMI da soli perché Spring lo farà automaticamente per noi se tale registro non è disponibile.

4. Applicazione client

Scriviamo ora l'applicazione client.

Iniziamo dichiarando il RmiProxyFactoryBean che creerà un bean che ha la stessa interfaccia esposta dal servizio in esecuzione sul lato server e che instraderà in modo trasparente le chiamate che riceverà al server:

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

Scriviamo quindi un semplice codice che avvii l'applicazione client e utilizzi il proxy definito nel passaggio precedente:

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); }

È ora sufficiente avviare il client per verificare che richiami il servizio esposto dal server.

5. conclusione

In questo tutorial, abbiamo visto come potremmo usare Spring Remoting per facilitare l'uso di RMI che altrimenti richiederebbe una serie di attività noiose come, tra tutte, la creazione di un registro e la definizione di servizi utilizzando interfacce che fanno un uso massiccio di eccezioni controllate.

Come al solito, troverai i sorgenti su GitHub.