Spring Remoting avec RMI

Spring Remoting avec RMI

1. Vue d'ensemble

JavaRemote Method Invocation permet d'appeler un objet résidant dans un autreJava Virtual Machine. C'est une technologie bien établie mais un peu lourde à utiliser, comme on peut le voir dans lesofficial Oracle trail dédiés au sujet.

Dans cet article rapide, nous allons explorer commentSpring Remoting permet de tirer parti deRMI de manière plus simple et plus propre.

Cet article complète également la présentation deSpring Remoting. Vous pouvez trouver des détails sur les autres technologies prises en charge dans les versions précédentes:HTTP Invokers,JMS,AMQP,Hessian, and Burlap.

2. Dépendances Maven

Comme nous l'avons fait dans nos articles précédents, nous allons configurer quelques applicationsSpring Boot: un serveur qui expose l'objet appelable distant et un client qui appelle le service exposé.

Tout ce dont nous avons besoin est dans le jar despring-context - afin que nous puissions l'apporter en utilisant l'aide deSpring Boot que nous préférons - parce que notre objectif principal est simplement d'avoir les bibliothèques principales disponibles.

Continuons maintenant avec lesspring-boot-starter-web habituels - en vous rappelant de supprimer la dépendanceTomcat pour exclure le service Web intégré:


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

3. Application serveur

Nous allons commencer à déclarer une interface qui définit un service pour réserver un trajet en taxi, qui sera éventuellement exposé aux clients:

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

Ensuite, nous définirons un bean qui implémente l'interface. C'est le bean qui exécutera la logique métier sur le serveur:

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

Continuons à déclarer lesExporter qui mettent le service à la disposition des clients. Dans ce cas, nous utiliserons lesRmiServiceExporter:

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

Grâce àsetServiceInterface(), nous fournissons une référence à l'interface qui sera appelée à distance.

Nous devrions également fournir une référence à l'objet exécutant réellement la méthode avecsetService(). Nous pourrions alors fournir le port desRMI registry disponibles sur la machine sur laquelle le serveur fonctionne si nous ne voulons pas utiliser le port par défaut 1099.

Nous devons également définir un nom de service, qui permet d'identifier le service exposé dans le registre deRMI.

Avec la configuration donnée, le client pourra contacter lesCabBookingService à l'URL suivante:rmi://HOST:1199/CabBookingService.

Allons enfin démarrer le serveur. Nous n'avons même pas besoin de démarrer le registre RMI par nous-mêmes carSpring le fera automatiquement pour nous si ce registre n'est pas disponible.

4. Application client

Écrivons maintenant l'application cliente.

Nous commençons à déclarer lesRmiProxyFactoryBean qui vont créer un bean qui a la même interface que celle exposée par le service s'exécutant côté serveur et qui acheminera de manière transparente les invocations qu'il recevra vers le serveur:

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

Écrivons ensuite un code simple qui démarre l'application cliente et utilise le proxy défini à l'étape précédente:

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

Il suffit maintenant de lancer le client pour vérifier qu'il appelle le service exposé par le serveur.

5. Conclusion

Dans ce tutoriel, nous avons vu comment nous pourrions utiliserSpring Remoting pour faciliter l'utilisation deRMI qui, autrement, nécessiteront une série de tâches fastidieuses comme, entre autres, la création d'un registre et la définition de services à l'aide d'interfaces qui font utilisation intensive des exceptions vérifiées.

Comme d'habitude, vous trouverez les sourcesover on GitHub.