Introduksjon til vårintegrasjon

1. Introduksjon

Denne artikkelen vil introdusere kjernekonseptene til vårintegrasjon først og fremst gjennom små, praktiske eksempler.

Spring Integration gir mange kraftige komponenter som kan forbedre sammenkoblingen av systemer og prosesser i en bedriftsarkitektur.

Det legemliggjør noen av de fineste og mest populære designmønstrene, og hjelper utviklere med å unngå å rulle sine egne.

Vi vil se på de spesifikke behovene som dette biblioteket fyller i en bedriftsapplikasjon, og hvorfor det er tilrådelig med noen av alternativene. Vi vil også se på noen tilgjengelige verktøy for å forenkle utviklingen av Spring Integration-baserte applikasjoner ytterligere.

2. Oppsett

 org.springframework.integration spring-integration-core 4.3.5.RELEASE org.springframework.integration spring-integration-file 4.3.5.RELEASE 

Du kan laste ned de nyeste versjonene av Spring Integration Core og Spring Integration File Support fra Maven Central.

3. Meldingsmønsteret

Et av grunnmønstrene i dette biblioteket er Messaging. Mønsteret er sentrert rundt meldinger - diskrete nyttelaster med data som beveger seg fra et opprinnelig system eller prosess til ett eller flere systemer eller prosesser via forhåndsdefinerte kanaler.

Historisk oppsto mønsteret som den mest fleksible måten å integrere flere forskjellige systemer på en måte som:

  • Frakobler nesten systemene som er involvert i integrasjonen
  • Tillater deltakersystemer i integrasjonen å være fullstendig agnostiske overfor hverandres underliggende protokoller, formatering eller andre implementeringsdetaljer
  • Oppmuntrer til utvikling og gjenbruk av komponenter som er involvert i integrasjonen

4. Integrering av meldinger i aksjon

La oss vurdere et grunnleggende eksempel som kopierer en MPEG-videofil fra en bestemt mappe til en annen konfigurert mappe:

@Configuration @EnableIntegration public class BasicIntegrationConfig {public String INPUT_DIR = "the_source_dir"; offentlig streng OUTPUT_DIR = "the_dest_dir"; offentlig streng FILE_PATTERN = "* .mpeg"; @Bean offentlig MessageChannel fileChannel () {returner ny DirectChannel (); } @Bean @InboundChannelAdapter (verdi = "fileChannel", poller = @Poller (fixedDelay = "1000")) offentlig MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = ny FileReadingMessageSource (); sourceReader.setDirectory (ny fil (INPUT_DIR)); sourceReader.setFilter (ny SimplePatternFileListFilter (FILE_PATTERN)); return sourceReader; } @Bean @ServiceActivator (inputChannel = "fileChannel") offentlig MessageHandler fileWritingMessageHandler () {FileWritingMessageHandler handler = ny FileWritingMessageHandler (ny fil (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); returbehandler; }}

Koden ovenfor konfigurerer en tjenesteaktivator, en integrasjonskanal og en inngående kanaladapter.

Vi vil undersøke hver av disse komponenttypene nærmere om kort tid. De @EnableIntegration merknad betegner denne klassen som en vårintegrasjonskonfigurasjon.

La oss starte vår sammenheng med vårintegrasjon:

public static void main (String ... args) {AbstractApplicationContext context = new AnnotationConfigApplicationContext (BasicIntegrationConfig.class); context.registerShutdownHook (); Skannerskanner = ny skanner (System.in); System.out.print ("Vennligst skriv inn q og trykk for å avslutte programmet:"); while (true) {String input = scanner.nextLine (); if ("q" .equals (input.trim ())) {break; }} System.exit (0); }

Hovedmetoden ovenfor starter integrasjonskonteksten; det godtar ogsåq”Tegninngang fra kommandolinjen for å avslutte programmet. La oss undersøke komponentene mer detaljert.

5. Vårintegrasjonskomponenter

5.1. Beskjed

De org.springframework.integration.Message grensesnitt definerer fjærmeldingen: enheten for dataoverføring innenfor en fjærintegrasjonskontekst.

offentlig grensesnitt Melding {T getPayload (); MessageHeaders getHeaders (); }

Den definerer tilgang til to nøkkelelementer:

  • Meldingsoverskrifter, egentlig en nøkkelverdi-beholder som kan brukes til å overføre metadata, som definert i org.springframework.integration.MessageHeaders klasse
  • Meldingens nyttelast, som er de faktiske dataene som er av verdi som skal overføres - i vårt tilfelle er videofilen nyttelasten

5.2. Kanal

En kanal i vårintegrasjon (og faktisk EAI) er den grunnleggende rørleggerarbeidet i en integrasjonsarkitektur. Det er røret som meldingene videreformidles fra ett system til et annet.

Du kan tenke på det som et bokstavelig rør som et integrert system eller en prosess kan føre meldinger til (eller motta meldinger fra) andre systemer.

Kanaler i vårintegrasjon kommer i forskjellige smaker, avhengig av ditt behov. De er i stor grad konfigurerbare og brukbare ut av esken, uten noen tilpasset kode, men hvis du har tilpassede behov, er det et robust rammeverk tilgjengelig.

Punkt-til-punkt (P2P) kanaler brukes til å etablere 1 til 1 kommunikasjonslinjer mellom systemer eller komponenter. En komponent publiserer en melding til kanalen, slik at en annen kan hente den. Det kan bare være en komponent i hver ende av kanalen.

Som vi har sett, er konfigurering av en kanal så enkelt som å returnere en forekomst av DirectChannel:

@Bean offentlig MessageChannel fileChannel1 () {returner ny DirectChannel (); } @Bean offentlig MessageChannel fileChannel2 () {returner ny DirectChannel (); } @Bean offentlig MessageChannel fileChannel3 () {returner ny DirectChannel (); }

Her har vi definert tre separate kanaler, alle identifisert av navnet på deres respektive gettermetoder.

Publiser-abonner (Pub-Sub) kanaler brukes til å etablere en en-til-mange kommunikasjonslinje mellom systemer eller komponenter. Dette vil tillate oss å publisere til alle de 3 direkte kanalene vi opprettet tidligere.

Så etter vårt eksempel kan vi erstatte P2P-kanalen med en pub-underkanal:

@Bean public MessageChannel pubSubFileChannel () {returner nye PublishSubscribeChannel (); } @Bean @InboundChannelAdapter (verdi = "pubSubFileChannel", poller = @Poller (fixedDelay = "1000")) offentlig MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = ny FileReadingMessageSource (); sourceReader.setDirectory (ny fil (INPUT_DIR)); sourceReader.setFilter (ny SimplePatternFileListFilter (FILE_PATTERN)); return sourceReader; } 

Vi har nå konvertert den inngående kanaladapteren til å publisere den til en Pub-Sub-kanal. Dette vil tillate oss å sende filene som blir lest fra kildemappen til flere destinasjoner.

5.3. Bro

En bro i vårintegrasjon brukes til å koble til to meldingskanaler eller adaptere hvis de av en eller annen grunn ikke kan koble direkte.

I vårt tilfelle kan vi bruke en bro for å koble vår Pub-Sub-kanal til tre forskjellige P2P-kanaler (fordi P2P- og Pub-Sub-kanaler ikke kan kobles direkte):

@Bean @BridgeFrom (value = "pubSubFileChannel") offentlig MessageChannel fileChannel1 () {returner ny DirectChannel (); } @Bean @BridgeFrom (value = "pubSubFileChannel") offentlig MessageChannel fileChannel2 () {returner ny DirectChannel (); } @Bean @BridgeFrom (value = "pubSubFileChannel") offentlig MessageChannel fileChannel3 () {returner ny DirectChannel (); }

Ovenstående bønnekonfigurasjon bygger nå bro over pubSubFileChannel til tre P2P-kanaler. De @BridgeFrom kommentar er det som definerer en bro og kan brukes på et hvilket som helst antall kanaler som trenger å abonnere på Pub-Sub-kanalen.

Vi kan lese koden ovenfor som "lage en bro fra pubSubFileChannel til fileChannel1, fileChannel2 og fileChannel3 slik at meldinger fra pubSubFileChannel kan mates til alle tre kanalene samtidig. ”

5.4. Tjenesteaktivator

Service Activator er en hvilken som helst POJO som definerer @ServiceActivator kommentar om en gitt metode. Dette gjør at vi kan utføre en hvilken som helst metode på vår POJO når en melding mottas fra en inngående kanal, og det lar oss skrive meldinger til en utadgående kanal.

I vårt eksempel mottar vår tjenesteaktivator en fil fra den konfigurerte inngangskanal og skriver den til den konfigurerte mappen.

5.5. Adapter

Adapteren er en bedriftsintegrasjonsmønsterbasert komponent som lar en "plug-in" til et system eller datakilde. Det er nesten bokstavelig talt en adapter slik vi kjenner den fra å plugge den i en stikkontakt eller elektronisk enhet.

Det tillater gjenbrukbare tilkoblinger til ellers “black-box” -systemer som databaser, FTP-servere og meldingssystemer som JMS, AMQP og sosiale nettverk som Twitter. Den allestedsnærværende behovet for å koble til disse systemene betyr at adaptere er veldig bærbare og gjenbrukbare (faktisk er det en liten katalog med adaptere, fritt tilgjengelig og klar til bruk for alle).

Adaptere faller inn i to brede kategorier - inngående og utgående.

La oss undersøke disse kategoriene i sammenheng med adapterne som er brukt i vårt eksemplarscenario:

Innkommende adaptere, som vi har sett, brukes til å hente inn meldinger fra det eksterne systemet (i dette tilfellet en filsystemkatalog).

Vår innkommende adapterkonfigurasjon består av:

  • An @InboundChannelAdapter merknad som markerer bønnekonfigurasjonen som en adapter - vi konfigurerer kanalen som adapteren vil mate meldinger til (i vårt tilfelle en MPEG-fil) og en poller, en komponent som hjelper adapteren med å avstemme den konfigurerte mappen med det angitte intervallet
  • En standard Spring java-konfigurasjonsklasse som returnerer a FileReadingMessageSource, implementeringen av vårintegrasjonsklassen som håndterer polling av filsystemer

Utgående adaptere brukes til å sende meldinger utover. Spring Integration støtter et stort utvalg av out-of-the-box adaptere for forskjellige vanlige bruksområder.

6. Konklusjon

Vi har undersøkt en grunnleggende brukssak med Spring Integration som demonstrerer den java-baserte konfigurasjonen av biblioteket og gjenbrukbarhet av tilgjengelige komponenter.

Vårintegrasjonskode kan distribueres som et frittstående prosjekt i JavaSE, så vel som en del av noe større i et Jakarta EE-miljø. Selv om det ikke konkurrerer direkte med andre EAI-sentriske produkter og mønstre som Enterprise Service Buses (ESBs), er det et levedyktig, lett alternativ til å løse mange av de samme problemene som ESBs ble bygget for å løse.

Du finner kildekoden for denne artikkelen i Github-prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found