Úvod do jarnej integrácie

1. Úvod

Tento článok bude predstaviť základné koncepty jarnej integrácie predovšetkým prostredníctvom malých praktických príkladov.

Jarná integrácia poskytuje veľa výkonných komponentov, ktoré môžu výrazne zvýšiť vzájomné prepojenie systémov a procesov v rámci podnikovej architektúry.

Stelesňuje niektoré z najlepších a najobľúbenejších vzorov dizajnu a pomáha vývojárom vyhnúť sa používaniu tých svojich.

Zoznámime sa s konkrétnymi potrebami, ktoré táto knižnica napĺňa pre podnikovú aplikáciu, a prečo je vhodné zvážiť niektoré z jej alternatív. Taktiež sa pozrieme na niektoré dostupné nástroje na ďalšie zjednodušenie vývoja aplikácií založených na jarnej integrácii.

2. Inštalácia

 org.springframework.integration súbor jarnej integrácie 4.3.5.RELEASE org.springframework.integration súbor jarnej integrácie 4.3.5.RELEASE 

Najnovšie verzie Spring Integration Core a Spring Spring Integration File Support si môžete stiahnuť z Maven Central.

3. Vzor správ

Jedným zo základných vzorov v tejto knižnici je Messaging. Vzor je sústredený okolo správ - diskrétnych užitočných dát, ktoré sa pohybujú z pôvodného systému alebo procesu do jedného alebo viacerých systémov alebo procesov prostredníctvom preddefinovaných kanálov.

Historicky vzorec vznikol ako najpružnejší spôsob integrácie viacerých rozdielnych systémov spôsobom, ktorý:

  • Systémy zapojené do integrácie sú takmer úplne oddelené
  • Umožňuje účastníckym systémom v integrácii byť úplne agnostik voči všetkým ostatným podkladovým protokolom, formátovaniu alebo iným podrobnostiam implementácie
  • Podporuje vývoj a opätovné použitie komponentov zapojených do integrácie

4. Integrácia správ v akcii

Uvažujme základný príklad ktorý skopíruje video súbor MPEG z určeného priečinka do iného nakonfigurovaného priečinka:

@Configuration @EnableIntegration verejná trieda BasicIntegrationConfig {verejný reťazec INPUT_DIR = "the_source_dir"; public String OUTPUT_DIR = "the_dest_dir"; public String FILE_PATTERN = "* .mpeg"; @Bean public MessageChannel fileChannel () {vrátiť nový DirectChannel (); } @Bean @InboundChannelAdapter (value = "fileChannel", poller = @Poller (fixedDelay = "1000")) public MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = nový FileReadingMessageSource (); sourceReader.setDirectory (nový súbor (INPUT_DIR)); sourceReader.setFilter (nový SimplePatternFileListFilter (FILE_PATTERN)); návrat sourceReader; } @Bean @ServiceActivator (inputChannel = "fileChannel") public MessageHandler fileWritingMessageHandler () {FileWritingMessageHandler handler = nový FileWritingMessageHandler (nový súbor (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); obsluha návratu; }}

Vyššie uvedený kód konfiguruje aktivátor služby, integračný kanál a adaptér prichádzajúceho kanála.

Čoskoro podrobne preskúmame každý z týchto typov komponentov. The @EnableIntegration anotácia označuje túto triedu ako konfiguráciu Spring Integration.

Začnime náš kontext aplikácie Spring Integration:

public static void main (String ... args) {AbstractApplicationContext context = nový AnnotationConfigApplicationContext (BasicIntegrationConfig.class); context.registerShutdownHook (); Skener skener = nový skener (System.in); System.out.print ("Prosím, zadajte q a stlačte pre opustenie programu:"); while (true) {String input = scanner.nextLine (); if ("q" .equals (input.trim ())) {break; }} System.exit (0); }

Vyššie uvedená hlavná metóda spúšťa kontext integrácie; prijíma tiež „q”Zadávanie znakov z príkazového riadku na ukončenie programu. Poďme preskúmať komponenty podrobnejšie.

5. Súčasti jarnej integrácie

5.1. Správa

The org.springframework.integration.Message rozhranie definuje pružinu Správa: jednotka prenosu dát v kontexte jarnej integrácie.

verejné rozhranie Správa {T getPayload (); MessageHeaders getHeaders (); }

Definuje prístupové práva k dvom kľúčovým prvkom:

  • Hlavičky správ, v podstate kontajner kľúč - hodnota, ktorý možno použiť na prenos metadát, ako sú definované v dokumente org.springframework.integration.MessageHeaders trieda
  • Užitočné zaťaženie správy, čo sú skutočné údaje, ktoré majú hodnotu, ktorá sa má preniesť - v našom prípade použitia je užitočným zaťažením videosúbor.

5.2. Kanál

Kanál v jarnej integrácii (a skutočne aj EAI) je základným inštalatérom v integračnej architektúre. Je to kanál, ktorým sa prenášajú správy z jedného systému do druhého.

Môžete si to predstaviť ako doslovný kanál, cez ktorý môže integrovaný systém alebo proces tlačiť správy do (alebo prijímať správy) z iných systémov.

Kanály v jarnej integrácii majú rôzne príchute, podľa vašej potreby. Sú do značnej miery konfigurovateľné a použiteľné ihneď po vybalení z krabice bez vlastného kódu, ale ak máte vlastné potreby, je k dispozícii robustný rámec.

Point-to-Point (P2P) kanály sa používajú na zavedenie komunikačných liniek 1: 1 medzi systémami alebo komponentmi. Jeden komponent zverejní správu na kanáli, aby si ju mohol druhý vyzdvihnúť. Na každom konci kanála môže byť iba jeden komponent.

Ako sme videli, konfigurácia kanála je rovnako jednoduchá ako vrátenie inštancie DirectChannel:

@Bean public MessageChannel fileChannel1 () {vrátiť nový DirectChannel (); } @Bean public MessageChannel fileChannel2 () {vrátiť nový DirectChannel (); } @Bean public MessageChannel fileChannel3 () {vrátiť nový DirectChannel (); }

Tu sme definovali tri samostatné kanály, ktoré boli všetky identifikované názvom ich príslušných metód getra.

Publish-Subscribe (Pub-Sub) kanály sa používajú na vytvorenie komunikačnej linky jedna k mnohým medzi systémami alebo komponentmi. To nám umožní zverejniť všetky 3 priame kanály, ktoré sme vytvorili skôr.

Podľa nášho príkladu teda môžeme nahradiť P2P kanál pub-sub kanálom:

@Bean public MessageChannel pubSubFileChannel () {vrátiť nový PublishSubscribeChannel (); } @Bean @InboundChannelAdapter (value = "pubSubFileChannel", poller = @Poller (fixedDelay = "1000")) verejný MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = nový FileReadingMessageSource (); sourceReader.setDirectory (nový súbor (INPUT_DIR)); sourceReader.setFilter (nový SimplePatternFileListFilter (FILE_PATTERN)); návrat sourceReader; } 

Teraz sme konvertovali adaptér prichádzajúceho kanála na publikovanie na kanál Pub-Sub. Toto nám umožní poslať súbory, ktoré sa čítajú zo zdrojového priečinka, na viac cieľov.

5.3. Most

Most v jarnej integrácii sa používa na pripojenie dvoch kanálov správ alebo adaptérov, ak sa z nejakého dôvodu nemôžu pripojiť priamo.

V našom prípade môžeme použiť most na prepojenie nášho Pub-Sub kanála s tromi rôznymi P2P kanálmi (pretože P2P a Pub-Sub kanály nie je možné pripojiť priamo):

@Bean @BridgeFrom (value = "pubSubFileChannel") public MessageChannel fileChannel1 () {return new DirectChannel (); } @Bean @BridgeFrom (value = "pubSubFileChannel") public MessageChannel fileChannel2 () {return new DirectChannel (); } @Bean @BridgeFrom (value = "pubSubFileChannel") public MessageChannel fileChannel3 () {return new DirectChannel (); }

Vyššie uvedená konfigurácia fazule teraz premosťuje pubSubFileChannel na tri kanály P2P. The @BridgeFrom anotácia je definícia mosta, ktorú je možné použiť na ľubovoľný počet kanálov, ktoré si musia predplatiť kanál Pub-Sub.

Vyššie uvedený kód môžeme čítať ako „vytvorte most z pubSubFileChannel do fileChannel1, fileChannel2 a fileChannel3 aby správy z pubSubFileChannel možno privádzať na všetky tri kanály súčasne. “

5.4. Aktivátor služby

Aktivátorom služby je každý POJO, ktorý definuje @ServiceActivator anotácia k danej metóde. To nám umožňuje vykonať ľubovoľnú metódu na našom POJO, keď je správa prijatá z prichádzajúceho kanála, a umožňuje nám to písať správy do vonkajšieho kanála.

V našom príklade náš aktivátor služby dostane súbor od nakonfigurovaného vstupný kanál a zapíše ju do nakonfigurovaného priečinka.

5.5. Adaptér

Adaptér je komponent založený na vzore podnikovej integrácie, ktorý umožňuje „plug-in“ do systému alebo zdroja údajov. Je to takmer doslova adaptér, ako ho poznáme zo zapojenia do zásuvky alebo elektronického zariadenia.

Umožňuje opakovane použiteľné pripojenie k inak „black-boxovým“ systémom, ako sú databázy, servery FTP a systémy správ, ako sú JMS, AMQP, a sociálne siete, ako je Twitter. Všadeprítomnosť potreby pripojiť sa k týmto systémom znamená, že adaptéry sú veľmi prenosné a opakovane použiteľné (v skutočnosti existuje malý katalóg adaptérov, ktorý je voľne dostupný a pripravený na použitie kýmkoľvek).

Adaptéry spadajú do dvoch širokých kategórií - prichádzajúce a odchádzajúce.

Poďme preskúmať tieto kategórie v kontexte adaptérov používaných v našom vzorovom scenári:

Prichádzajúce adaptéry, ako sme videli, používajú sa na prenos správ z externého systému (v tomto prípade adresára súborového systému).

Naša konfigurácia prichádzajúceho adaptéra pozostáva z:

  • An @InboundChannelAdapter anotácia, ktorá označuje konfiguráciu fazule ako adaptér - konfigurujeme kanál, na ktorý bude adaptér prenášať svoje správy (v našom prípade súbor MPEG) a poller, komponent, ktorý pomáha adaptéru dopytovať nakonfigurovaný priečinok v zadanom intervale
  • Štandardná trieda konfigurácie java na jar, ktorá vracia a FileReadingMessageSource, implementácia triedy Spring Integration, ktorá zvláda dopytovanie súborového systému

Odchádzajúce adaptéry sa používajú na odosielanie správ smerom von. Spring Integration podporuje veľké množstvo out-of-the-box adaptérov pre rôzne bežné prípady použitia.

6. Záver

Preskúmali sme základný prípad použitia s jarnou integráciou, ktorý demonštruje konfiguráciu knižnice na základe javy a opätovnú použiteľnosť dostupných komponentov.

Kód Spring Integration je možné nasadiť ako samostatný projekt v rámci JavaSE, ako aj súčasť niečoho väčšieho v prostredí Jakarty EE. Aj keď priamo nekonkuruje iným produktom a modelom zameraným na EAI, ako sú Enterprise Service Buses (ESB), je to životaschopná a ľahká alternatíva k riešeniu mnohých rovnakých problémov, na ktoré boli postavené ESB.

Zdrojový kód tohto článku nájdete v projekte Github.