Inleiding tot Spring-integratie

1. Inleiding

Dit artikel zal introduceer de kernconcepten van Spring Integration voornamelijk door middel van kleine, praktische voorbeelden.

Spring Integration biedt veel krachtige componenten die de interconnectiviteit van systemen en processen binnen een bedrijfsarchitectuur aanzienlijk kunnen verbeteren.

Het belichaamt enkele van de beste en meest populaire ontwerppatronen, waardoor ontwikkelaars kunnen voorkomen dat ze hun eigen patronen rollen.

We zullen kijken naar de specifieke behoeften die deze bibliotheek vervult in een bedrijfstoepassing en waarom het aan te raden is over enkele van zijn alternatieven. We zullen ook enkele beschikbare tools bekijken om de ontwikkeling van op Spring Integration gebaseerde applicaties verder te vereenvoudigen.

2. Installatie

 org.springframework.integration spring-integratie-core 4.3.5.RELEASE org.springframework.integration spring-integratie-bestand 4.3.5.RELEASE 

U kunt de nieuwste versies van Spring Integration Core en de Spring Integration File Support downloaden van Maven Central.

3. Het berichtenpatroon

Een van de fundamentele patronen in deze bibliotheek is Messaging. Het patroon is gecentreerd rond berichten - afzonderlijke ladingen aan gegevens die van een systeem of proces van oorsprong naar een of meerdere systemen of processen gaan via vooraf gedefinieerde kanalen.

Historisch gezien ontstond het patroon als de meest flexibele manier om meerdere ongelijksoortige systemen te integreren op een manier die:

  • Ontkoppelt de systemen die bij de integratie zijn betrokken vrijwel volledig
  • Hiermee kunnen systemen van de deelnemer in de integratie volledig agnostisch zijn ten opzichte van elkaars onderliggende protocollen, opmaak of andere implementatiedetails
  • Stimuleert de ontwikkeling en het hergebruik van componenten die betrokken zijn bij de integratie

4. Messaging-integratie in actie

Laat ons nadenken een eenvoudig voorbeeld die een MPEG-videobestand van een aangewezen map naar een andere geconfigureerde map kopieert:

@Configuration @EnableIntegration openbare klasse BasicIntegrationConfig {openbare String INPUT_DIR = "the_source_dir"; public String OUTPUT_DIR = "the_dest_dir"; openbare String FILE_PATTERN = "* .mpeg"; @Bean openbaar MessageChannel fileChannel () {retourneer nieuw DirectChannel (); } @Bean @InboundChannelAdapter (waarde = "fileChannel", poller = @Poller (fixedDelay = "1000")) openbare MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = nieuwe FileReadingMessageSource (); sourceReader.setDirectory (nieuw bestand (INPUT_DIR)); sourceReader.setFilter (nieuwe SimplePatternFileListFilter (FILE_PATTERN)); retour sourceReader; } @Bean @ServiceActivator (inputChannel = "fileChannel") openbare MessageHandler fileWritingMessageHandler () {FileWritingMessageHandler-handler = nieuwe FileWritingMessageHandler (nieuw bestand (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); terugkeer afhandelaar; }}

De bovenstaande code configureert een service-activator, een integratiekanaal en een inkomende kanaaladapter.

We zullen elk van deze componenttypen binnenkort in meer detail bekijken. De @EnableIntegration annotation duidt deze klasse aan als een Spring Integration-configuratie.

Laten we beginnen met onze Spring Integration-toepassingscontext:

openbare statische leegte hoofd (String ... args) {AbstractApplicationContext context = nieuwe AnnotationConfigApplicationContext (BasicIntegrationConfig.class); context.registerShutdownHook (); Scannerscanner = nieuwe scanner (System.in); System.out.print ("Voer q in en druk om het programma af te sluiten:"); while (true) {String input = scanner.nextLine (); if ("q" .equals (input.trim ())) {break; }} System.exit (0); }

De belangrijkste methode hierboven start de integratiecontext; het accepteert ook de "q”Tekeninvoer vanaf de opdrachtregel om het programma af te sluiten. Laten we de componenten in meer detail bekijken.

5. Veerintegratiecomponenten

5.1. Bericht

De org.springframework.integration.Message interface definieert de Spring Message: de eenheid van gegevensoverdracht binnen een Spring Integration-context.

openbare interface Bericht {T getPayload (); MessageHeaders getHeaders (); }

Het definieert accessors voor twee sleutelelementen:

  • Berichtkoppen, in wezen een sleutelwaardecontainer die kan worden gebruikt om metagegevens te verzenden, zoals gedefinieerd in het org.springframework.integration.MessageHeaders klasse
  • De payload van het bericht, de feitelijke gegevens die van waarde zijn om te worden overgedragen - in ons geval is het videobestand de payload

5.2. Kanaal

Een kanaal in Spring Integration (en inderdaad, EAI) is het basis sanitair in een integratiearchitectuur. Het is de buis waardoor berichten van het ene systeem naar het andere worden doorgestuurd.

Je kunt het zien als een letterlijke pijp waardoor een geïntegreerd systeem of proces berichten kan pushen naar (of berichten kan ontvangen van) andere systemen.

Kanalen in Spring Integration zijn er in verschillende smaken, afhankelijk van uw behoefte. Ze zijn grotendeels configureerbaar en direct bruikbaar, zonder aangepaste code, maar als u aangepaste behoeften heeft, is er een robuust framework beschikbaar.

Punt-naar-punt (P2P) kanalen worden gebruikt om 1-op-1 communicatielijnen tussen systemen of componenten tot stand te brengen. Een component publiceert een bericht naar het kanaal, zodat een ander het kan oppikken. Er kan slechts één component aan elk uiteinde van het kanaal zijn.

Zoals we hebben gezien, is het configureren van een kanaal net zo eenvoudig als het retourneren van een instantie van DirectChannel:

@Bean openbaar MessageChannel fileChannel1 () {retourneer nieuw DirectChannel (); } @Bean openbaar MessageChannel fileChannel2 () {retourneer nieuw DirectChannel (); } @Bean openbaar MessageChannel fileChannel3 () {retourneer nieuw DirectChannel (); }

Hier hebben we drie afzonderlijke kanalen gedefinieerd die allemaal worden aangeduid met de naam van hun respectievelijke getter-methoden.

Publiceren en abonneren (Pub-Sub) kanalen worden gebruikt om een ​​één-op-veel-communicatielijn tot stand te brengen tussen systemen of componenten. Hierdoor kunnen we publiceren naar alle 3 de directe kanalen die we eerder hebben gemaakt.

Dus volgens ons voorbeeld kunnen we het P2P-kanaal vervangen door een pub-subkanaal:

@Bean openbaar MessageChannel pubSubFileChannel () {retourneer nieuwe PublishSubscribeChannel (); } @Bean @InboundChannelAdapter (waarde = "pubSubFileChannel", poller = @Poller (fixedDelay = "1000")) openbare MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = nieuwe FileReadingMessageSource (); sourceReader.setDirectory (nieuw bestand (INPUT_DIR)); sourceReader.setFilter (nieuwe SimplePatternFileListFilter (FILE_PATTERN)); retour sourceReader; } 

We hebben nu de inkomende kanaaladapter geconverteerd om te publiceren naar een Pub-Sub-kanaal. Hierdoor kunnen we de bestanden die worden gelezen vanuit de bronmap naar meerdere bestemmingen sturen.

5.3. Brug

Een bridge in Spring Integration wordt gebruikt om twee berichtkanalen of adapters met elkaar te verbinden als ze om welke reden dan ook niet rechtstreeks kunnen verbinden.

In ons geval kunnen we een bridge gebruiken om ons Pub-Sub-kanaal te verbinden met drie verschillende P2P-kanalen (omdat P2P- en Pub-Sub-kanalen niet rechtstreeks kunnen worden verbonden):

@Bean @BridgeFrom (waarde = "pubSubFileChannel") openbaar MessageChannel fileChannel1 () {retourneer nieuw DirectChannel (); } @Bean @BridgeFrom (waarde = "pubSubFileChannel") openbaar MessageChannel fileChannel2 () {retourneer nieuw DirectChannel (); } @Bean @BridgeFrom (waarde = "pubSubFileChannel") openbaar MessageChannel fileChannel3 () {retourneer nieuw DirectChannel (); }

De bovenstaande bonenconfiguratie overbrugt nu het pubSubFileChannel tot drie P2P-kanalen. De @BridgeFrom annotatie is wat een brug definieert en kan worden toegepast op een willekeurig aantal kanalen die zich moeten abonneren op het Pub-Sub-kanaal.

We kunnen de bovenstaande code lezen als “maak een brug van het pubSubFileChannel naar fileChannel1, fileChannel2 en fileChannel3 zodat berichten van pubSubFileChannel kunnen tegelijkertijd naar alle drie de kanalen worden gestuurd. "

5.4. Dienst Activator

De Service Activator is elke POJO die de @ServiceActivator annotatie op een bepaalde methode. Dit stelt ons in staat om elke methode op onze POJO uit te voeren wanneer een bericht wordt ontvangen van een inkomend kanaal, en het stelt ons in staat om berichten naar een uitgaand kanaal te schrijven.

In ons voorbeeld ontvangt onze service-activator een bestand van het geconfigureerde ingangskanaal en schrijft het naar de geconfigureerde map.

5.5. Adapter

De adapter is een onderdeel op basis van een bedrijfsintegratiepatroon waarmee u zich kunt 'aansluiten' op een systeem of gegevensbron. Het is bijna letterlijk een adapter zoals we die kennen van het aansluiten op een stopcontact of elektronisch apparaat.

Het maakt herbruikbare connectiviteit mogelijk met anders "black-box" -systemen zoals databases, FTP-servers en berichtensystemen zoals JMS, AMQP en sociale netwerken zoals Twitter. De alomtegenwoordigheid van de noodzaak om verbinding te maken met deze systemen betekent dat adapters zeer draagbaar en herbruikbaar zijn (in feite is er een kleine catalogus met adapters, vrij verkrijgbaar en klaar voor gebruik door iedereen).

Adapters vallen in twee brede categorieën: inkomend en uitgaand.

Laten we deze categorieën onderzoeken in de context van de adapters die in ons voorbeeldscenario worden gebruikt:

Inkomende adapters, zoals we hebben gezien, worden gebruikt om berichten van het externe systeem binnen te brengen (in dit geval een bestandssysteemdirectory).

Onze inkomende adapterconfiguratie bestaat uit:

  • Een @BuienRadarNL annotatie die de bean-configuratie markeert als een adapter - we configureren het kanaal waarnaar de adapter zijn berichten stuurt (in ons geval een MPEG-bestand) en een poller, een component die de adapter helpt om de geconfigureerde map met het opgegeven interval te pollen
  • Een standaard Spring java-configuratieklasse die een FileReadingMessageSource, de implementatie van de Spring Integration-klasse die het pollen van het bestandssysteem afhandelt

Uitgaande adapters worden gebruikt om berichten naar buiten te sturen. Spring Integration ondersteunt een grote verscheidenheid aan kant-en-klare adapters voor verschillende veelvoorkomende gebruiksscenario's.

6. Conclusie

We hebben een basisgebruikscasus met Spring Integration onderzocht die de op Java gebaseerde configuratie van de bibliotheek en herbruikbaarheid van de beschikbare componenten demonstreert.

Spring Integration-code is inzetbaar als een op zichzelf staand project binnen JavaSE en als onderdeel van iets groters in een Jakarta EE-omgeving. Hoewel het niet direct concurreert met andere EAI-gerichte producten en patronen zoals Enterprise Service Buses (ESB's), is het een haalbaar, lichtgewicht alternatief voor het oplossen van veel van dezelfde problemen waarvoor ESB's zijn gebouwd om op te lossen.

Je kunt de broncode voor dit artikel vinden in het Github-project.