Fjederfjernelse med RMI

1. Oversigt

Java Fjernindkaldelse af metode tillader påkald af et objekt, der er bosat i et andet Java Virtual Machine. Det er en veletableret teknologi, men alligevel lidt besværlig at bruge, som vi kan se i det officielle Oracle-spor dedikeret til emnet.

I denne hurtige artikel undersøger vi hvordan Fjederfjernelse muliggør gearing RMI på en lettere og renere måde.

Denne artikel fuldender også oversigten over Fjederfjernelse. Du kan finde detaljer om andre understøttede teknologier i de tidligere rater: HTTP Invokers, JMS, AMQP, Hessian og Burlap.

2. Maven-afhængigheder

Som vi gjorde i vores tidligere artikler, vil vi oprette et par Spring Boot applikationer: en server, der udsætter det eksterne objekt, der kan kaldes op, og en klient, der påberåber den eksponerede tjeneste.

Alt hvad vi har brug for er i forårskontekst krukke - så vi kan bringe det ind ved hjælp af hvad som helst Spring Boot hjælper vi foretrækker - fordi vores hovedmål er bare at have de vigtigste biblioteker til rådighed.

Lad os nu gå videre med det sædvanlige spring-boot-starter-web - huske at fjerne Tomcat afhængighed for at udelukke den integrerede webservice:

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

3. Serverapplikation

Vi begynder at erklære en grænseflade, der definerer en service til at bestille en tur i en taxa, der til sidst vil blive udsat for klienter:

offentlig grænseflade CabBookingService {Booking bookRide (String pickUpLocation) kaster BookingException; }

Derefter definerer vi en bønne, der implementerer grænsefladen. Dette er bønnen, der rent faktisk udfører forretningslogikken på serveren:

@Bean CabBookingService bookingService () {returner ny CabBookingServiceImpl (); }

Lad os fortsætte med at erklære Eksportør der gør tjenesten tilgængelig for klienter. I dette tilfælde bruger vi RmiServiceExporter:

@Bean RmiServiceExporter-eksportør (implementering af CabBookingService) {Class serviceInterface = CabBookingService.class; RmiServiceExporter eksportør = ny RmiServiceExporter (); eksportør.setServiceInterface (serviceInterface); eksportør.setService (implementering); exporter.setServiceName (serviceInterface.getSimpleName ()); eksportør.setRegistryPort (1099); retureksportør; }

igennem setServiceInterface () vi giver en henvisning til det interface, der kan foretages eksternt.

Vi skal også give en reference til det objekt, der faktisk udfører metoden med setService (). Vi kunne derefter levere havnen i RMI-registreringsdatabase tilgængelig på den maskine, hvor serveren kører, hvis vi ikke vil bruge standardporten 1099.

Vi skal også indstille et servicenavn, der gør det muligt at identificere den eksponerede tjeneste i RMI register.

Med den givne konfiguration vil klienten kunne kontakte CabBookingService på følgende URL: rmi: // HOST: 1199 / CabBookingService.

Lad os endelig starte serveren. Vi behøver ikke engang at starte RMI-registreringsdatabasen af ​​os selv, fordi Forår vil gøre det automatisk for os, hvis en sådan registreringsdatabase ikke er tilgængelig.

4. Kundeapplikation

Lad os skrive nu klientapplikationen.

Vi begynder at erklære RmiProxyFactoryBean der vil skabe en bønne, der har den samme grænseflade, der eksponeres af tjenesten, der kører på serversiden, og som gennemsigtigt dirigerer de påkald, den modtager til serveren:

@Bean RmiProxyFactoryBean-tjeneste () {RmiProxyFactoryBean rmiProxyFactory = ny RmiProxyFactoryBean (); rmiProxyFactory.setServiceUrl ("rmi: // localhost: 1099 / CabBookingService"); rmiProxyFactory.setServiceInterface (CabBookingService.class); returnere rmiProxyFactory; }

Lad os derefter skrive en simpel kode, der starter klientapplikationen og bruger den proxy, der blev defineret i det foregående trin:

offentlig statisk ugyldig hoved (String [] args) kaster 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); }

Det er nu nok at starte klienten for at kontrollere, at den påberåber den tjeneste, der er eksponeret af serveren.

5. Konklusion

I denne vejledning så vi, hvordan vi kunne bruge Fjederfjernelse for at lette brugen af RMI der ellers vil kræve en række kedelige opgaver, som blandt andet at spinde et register og definere tjenester ved hjælp af grænseflader, der gør tung brug af afkrydsede undtagelser.

Som sædvanligt finder du kilderne på GitHub.