Spring Remoting mit RMI

Spring Remoting mit RMI

1. Überblick

Mit JavaRemote Method Invocation kann ein Objekt aufgerufen werden, das sich in einem anderenJava Virtual Machine befindet. Es ist eine etablierte Technologie, deren Verwendung jedoch etwas umständlich ist, wie wir in denofficial Oracle trailehen können, die dem Thema gewidmet sind.

In diesem kurzen Artikel werden wir untersuchen, wieSpring Remoting es ermöglicht,RMI einfacher und sauberer zu nutzen.

Dieser Artikel vervollständigt auch die Übersicht überSpring Remoting. Details zu anderen unterstützten Technologien finden Sie in den vorherigen Abschnitten:HTTP Invokers,JMS,AMQP,Hessian, and Burlap.

2. Maven-Abhängigkeiten

Wie in unseren vorherigen Artikeln werden wir einigeSpring Boot-Anwendungen einrichten: einen Server, der das remote aufrufbare Objekt verfügbar macht, und einen Client, der den offengelegten Dienst aufruft.

Alles, was wir brauchen, befindet sich imspring-context-Jar - damit wir es mit dem von uns bevorzugtenSpring Boot-Helfer einspielen können -, da unser Hauptziel darin besteht, nur die Hauptbibliotheken verfügbar zu haben.

Fahren wir nun mit den üblichenspring-boot-starter-web fort. Denken Sie daran, die Abhängigkeit vonTomcat zu entfernen, um den eingebetteten Webdienst auszuschließen:


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

3. Serveranwendung

Wir werden damit beginnen, eine Schnittstelle zu deklarieren, die einen Service zum Buchen einer Taxifahrt definiert, der schließlich für Kunden verfügbar sein wird:

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

Dann definieren wir eine Bean, die die Schnittstelle implementiert. Dies ist die Bean, die die Geschäftslogik auf dem Server ausführt:

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

Lassen Sie uns weiterhin dieExporter deklarieren, die den Service für Clients verfügbar machen. In diesem Fall verwenden wirRmiServiceExporter:

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

DurchsetServiceInterface() geben wir einen Verweis auf die Schnittstelle an, die remote aufgerufen werden kann.

Wir sollten auch einen Verweis auf das Objekt bereitstellen, das die Methode tatsächlich mitsetService() ausführt. Wir könnten dann den Port derRMI registry bereitstellen, die auf dem Computer verfügbar sind, auf dem der Server ausgeführt wird, wenn wir den Standardport 1099 nicht verwenden möchten.

Wir sollten auch einen Dienstnamen festlegen, mit dem der exponierte Dienst in der Registrierung vonRMIidentifiziert werden kann.

Mit der angegebenen Konfiguration kann der Client dieCabBookingService unter der folgenden URL kontaktieren:rmi://HOST:1199/CabBookingService.

Starten wir endlich den Server. Wir müssen die RMI-Registrierung nicht einmal selbst starten, daSpring dies automatisch für uns erledigt, wenn eine solche Registrierung nicht verfügbar ist.

4. Client-Anwendung

Schreiben wir jetzt die Client-Anwendung.

Wir beginnen mit der Deklaration vonRmiProxyFactoryBean, die eine Bean erstellen, die dieselbe Schnittstelle aufweist, die vom auf der Serverseite ausgeführten Dienst verfügbar gemacht wird, und die die empfangenen Aufrufe transparent an den Server weiterleitet:

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

Schreiben wir dann einen einfachen Code, der die Clientanwendung startet und den im vorherigen Schritt definierten Proxy verwendet:

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

Es reicht jetzt aus, den Client zu starten, um zu überprüfen, ob er den vom Server bereitgestellten Dienst aufruft.

5. Fazit

In diesem Tutorial haben wir gesehen, wie wirSpring Remoting verwenden können, um die Verwendung vonRMI zu vereinfachen, die ansonsten eine Reihe langwieriger Aufgaben erfordern, z. B. das Hochfahren einer Registrierung und das Definieren von Diensten mithilfe von Schnittstellen, die erstellt werden starker Gebrauch von geprüften Ausnahmen.

Wie üblich finden Sie die Quellenover on GitHub.