Spring Remoting mit RMI

1. Übersicht

Mit Java Remote Method Invocation können Sie ein Objekt aufrufen, das sich in einer anderen Java Virtual Machine befindet . Es ist eine gut etablierte Technologie, deren Verwendung jedoch etwas umständlich ist, wie wir im offiziellen Oracle-Trail zu diesem Thema sehen können.

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

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

2. Maven-Abhängigkeiten

Wie in unseren vorherigen Artikeln werden wir einige Spring 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 im Spring-Kontext- JAR - damit wir es mit jedem von uns bevorzugten Spring Boot- Helfer einbinden können -, da unser Hauptziel darin besteht, nur die Hauptbibliotheken verfügbar zu haben.

Lassen Sie uns nun mit dem üblichen Spring-Boot-Starter-Web fortfahren. Denken Sie daran, die Tomcat- Abhängigkeit 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 den Kunden zugänglich 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 tatsächlich auf dem Server ausführt:

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

Lassen Sie uns weiterhin den Exporter deklarieren , der den Service für Clients verfügbar macht. In diesem Fall verwenden wir den 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; }

Über setServiceInterface () stellen wir einen Verweis auf die Schnittstelle bereit, die remote aufgerufen werden kann.

Wir sollten auch einen Verweis auf das Objekt bereitstellen, das die Methode tatsächlich mit setService () ausführt . Wir könnten dann den Port der RMI-Registrierung bereitstellen, der auf dem Computer verfügbar ist, 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 RMI- Registrierung identifiziert werden kann.

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

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

4. Client-Anwendung

Schreiben wir jetzt die Client-Anwendung.

Wir deklarieren die RmiProxyFactoryBean , die eine Bean erstellt, 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. Schlussfolgerung

In diesem Tutorial haben wir gesehen, wie wir Spring Remoting verwenden können , um die Verwendung von RMI zu vereinfachen, die andernfalls eine Reihe langwieriger Aufgaben erfordern, z. B. das Hochfahren einer Registrierung und das Definieren von Diensten mithilfe von Schnittstellen, bei denen geprüfte Ausnahmen häufig verwendet werden.

Wie üblich finden Sie die Quellen auf GitHub.