Jarná integrácia Java DSL

1. Úvod

V tomto výučbe sa dozvieme niečo o jarnej integrácii Java DSL na vytváranie integrácií aplikácií.

Vezmeme integráciu presunu súborov, ktorú sme vytvorili v Úvode do jarnej integrácie, a namiesto toho použijeme DSL.

2. Závislosti

Spring Integration Java DSL je súčasťou Spring Integration Core.

Môžeme teda pridať túto závislosť:

 org.springframework.integration spring-integration-core 5.0.6.RELEASE 

Aby sme mohli pracovať na našej aplikácii na presun súborov, budeme potrebovať aj Spring Integration File:

 org.springframework.integration spring-integration-file 5.0.6.RELEASE 

3. Jarná integrácia Java DSL

Pred jazykom Java DSL si používatelia konfigurovali komponenty Spring Integration v XML.

DSL predstavuje niekoľko plynulých nástrojov na vytváranie, z ktorých môžeme ľahko vytvoriť kompletný kanál Spring Integration čisto v Jave.

Povedzme, že sme chceli vytvoriť kanál, ktorý prevyšuje všetky údaje prichádzajúce potrubím.

V minulosti sme mohli robiť:

A teraz môžeme namiesto toho urobiť:

@Bean public IntegrationFlow upcaseFlow () {return IntegrationFlows.from ("input") .transform (String :: toUpperCase) .get (); }

4. Aplikácia na presun súborov

Na začatie integrácie presúvania súborov budeme potrebovať niekoľko jednoduchých stavebných blokov.

4.1. Integračný tok

Prvý stavebný blok, ktorý potrebujeme, je integračný tok, ktorý môžeme získať z IntegrationFlows staviteľ:

IntegrationFlows.from (...)

od môže trvať niekoľko typov, ale v tomto výučbe sa pozrieme len na tri:

  • MessageSources
  • MessageChannels a
  • Strings

O všetkých troch si povieme čoskoro.

Potom, čo sme zavolali od, máme teraz k dispozícii niektoré metódy prispôsobenia:

IntegrationFlow flow = IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ()) .handle (targetDirectory ()) // pridať ďalšie komponenty .get ();

Nakoniec IntegrationFlows vždy vytvorí inštanciu IntegrationFlow, čo je konečný produkt ktorejkoľvek aplikácie Spring Integration.

Tento model prijímania vstupov, vykonávania vhodných transformácií a vydávania výsledkov je základom pre všetky aplikácie Spring Integration.

4.2. Popis vstupného zdroja

Najskôr pri presúvaní súborov budeme musieť naznačiť nášmu integračnému toku, kde by ich mal hľadať, a preto potrebujeme a MessageSource:

@Bean public MessageSource sourceDirectory () {// .. vytvoriť zdroj správy}

Jednoducho povedané, a MessageSource je miesto, z ktorého môžu pochádzať správy, ktoré sú mimo aplikácie.

Presnejšie, potrebujeme niečo, čo môže prispôsobiť sa tento externý zdroj do reprezentácie jarných správ. A od tohto prispôsobenie je zameraný na vstup, tieto sa často nazývajú Adaptéry vstupných kanálov.

The súbor jarnej integrácie závislosť nám dáva adaptér vstupného kanála, ktorý je skvelý pre náš prípad použitia: FileReadingMessageSource:

@Bean public MessageSource sourceDirectory () {FileReadingMessageSource messageSource = nový FileReadingMessageSource (); messageSource.setDirectory (nový súbor (INPUT_DIR)); návrat messageSource; }

Tu, náš FileReadingMessageSource bude čítať adresár daný INPUT_DIR a vytvorí MessageSource od toho.

Zadajme to ako náš zdroj v IntegrationFlows.from vyvolanie:

IntegrationFlows.from (sourceDirectory ());

4.3. Konfigurácia vstupného zdroja

Teraz, ak o tom uvažujeme ako o dlhovekej aplikácii, pravdepodobne budeme chcieť, aby sme si mohli všimnúť súbory, keď prichádzajú, nielen presúvajte súbory, ktoré sa tam už nachádzajú pri štarte.

Na uľahčenie tohto od moze trvat aj navyse konfigurátorov ako ďalšie prispôsobenie vstupného zdroja:

IntegrationFlows.from (sourceDirectory (), konfigurátor -> configurer.poller (Pollers.fixedDelay (10 000)));

V takom prípade môžeme zvýšiť odolnosť nášho vstupného zdroja tak, že každých 10 sekúnd povieme aplikácii Spring Integration, aby dopytovala tento zdroj - v tomto prípade náš súborový systém.

A samozrejme to neplatí iba pre náš vstupný zdroj súborov, tento prieskum sme mohli pridať do ľubovoľného MessageSource.

4.4. Filtrovanie správ zo vstupného zdroja

Ďalej predpokladajme, že chceme, aby naša aplikácia na presun súborov presúvala iba konkrétne súbory, napríklad obrazové súbory, ktoré majú jpg predĺženie.

Na to môžeme použiť GenericSelector:

@Bean public GenericSelector onlyJpgs () {return new GenericSelector () {@Override public boolean accept (zdroj súboru) {return source.getName (). EndsWith (". Jpg"); }}; }

Poďme teda znova aktualizovať náš integračný tok:

IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ());

Alebo pretože tento filter je taký jednoduchý, mohli by sme ho namiesto toho definovať pomocou lambda:

IntegrationFlows.from (sourceDirectory ()) .filter (source -> ((File) source) .getName (). EndsWith (". Jpg"));

4.5. Zaobchádzanie so správami s aktivátormi služieb

Teraz, keď máme filtrovaný zoznam súborov, musíme ich zapísať na nové miesto.

Aktivátor službys sú to, na čo sa obrátime, keď uvažujeme o výstupoch v jarnej integrácii.

Použime FileWritingMessageHandler aktivátor služby z súbor jarnej integrácie:

@Bean public MessageHandler targetDirectory () {FileWritingMessageHandler handler = nový FileWritingMessageHandler (nový súbor (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); obsluha návratu; }

Tu, náš FileWritingMessageHandler napíše každý Správa užitočné zaťaženie, ktoré dostane do OUTPUT_DIR.

Znova aktualizujme:

IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ()) .handle (targetDirectory ());

A všimnite si, mimochodom, použitie setExpectReply. Pretože integračné toky môžu byťobojsmerný, toto vyvolanie naznačuje, že toto konkrétne potrubie je jedna cesta.

4.6. Aktivácia nášho integračného toku

Keď sme pridali všetky naše komponenty, musíme zaregistrujte sa IntegrationFlow ako fazuľa aktivovať:

@Bean public IntegrationFlow fileMover () {návrat IntegrationFlows.from (sourceDirectory (), c -> c.poller (Pollers.fixedDelay (10 000))). Filter (onlyJpgs ()) .handle (targetDirectory ()) .get () ; }

The dostať metóda extrakty an IntegrationFlow napríklad, že sa musíme zaregistrovať ako Spring Bean.

Hneď ako sa načíta náš kontext aplikácie, všetky naše komponenty obsiahnuté v našom IntegrationFlow sa aktivuje.

A teraz naša aplikácia začne presúvať súbory zo zdrojového adresára do cieľového adresára.

5. Ďalšie komponenty

V našej aplikácii na presun súborov založenej na DSL sme vytvorili adaptér pre prichádzajúce kanály, filter správ a aktivátor služby.

Pozrime sa na niekoľko ďalších bežných komponentov jarnej integrácie a pozrime sa, ako by sme ich mohli použiť.

5.1. Kanály správ

Ako už bolo spomenuté skôr, a Kanál správ je ďalší spôsob inicializácie toku:

IntegrationFlows.from ("anyChannel")

Môžeme to čítať ako „vyhľadajte alebo vytvorte fazuľu kanála s názvom anyChannel. Potom si prečítajte všetky údaje, ktoré sa do nich vložia anyChannel z iných tokov. “

Ale v skutočnosti je to všeobecnejšie ako to.

Zjednodušene povedané, kanál oddeľuje výrobcov od spotrebiteľov a môžeme o ňom uvažovať ako o Java Fronta. Kanál je možné vložiť do ktoréhokoľvek bodu toku.

Povedzme napríklad, že chceme uprednostniť súbory pri ich presune z jedného adresára do druhého:

@Bean public PriorityChannel abecedne () {vrátiť nový PriorityChannel (1000, (vľavo, vpravo) -> ((File) left.getPayload ()). GetName (). CompareTo (((File) right.getPayload ()). GetName ())); }

Potom môžeme vložiť vyvolanie na kanál medzi našim tokom:

@Bean public IntegrationFlow fileMover () {návrat IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ()) .channel ("abecedne") .handle (targetDirectory ()) .get (); }

Môžete si vybrať z desiatok kanálov, niektoré z tých šikovnejších súbežnosti, auditu alebo strednej vytrvalosti (myslite na vyrovnávacie pamäte Kafka alebo JMS).

Kanály tiež môžu byť silné v kombinácii s Mosts.

5.2. Most

Keď chceme kombinovať dva kanály, používame a Most.

Predstavme si, že namiesto priameho zápisu do výstupného adresára sme namiesto toho nechali našu aplikáciu na presun súborov zapísať na iný kanál:

@Bean public IntegrationFlow fileReader () {návrat IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ()) .channel ("holdingTank") .get (); }

Pretože sme to jednoducho napísali na kanál, môžeme odtiaľ premosťovať na ďalšie toky.

Vytvorme most, ktorý pošle nášmu zadržiavaciemu tanku správy a zapíše ich do cieľa:

@Bean public IntegrationFlow fileWriter () {return IntegrationFlows.from ("holdingTank") .bridge (e -> e.poller (Pollers.fixedRate (1, TimeUnit.SECONDS, 20))) .handle (targetDirectory ()) .get (); }

Opäť platí, že pretože sme písali na sprostredkujúci kanál, teraz môžeme pridať ďalší tok ktorý vezme rovnaké súbory a zapíše ich inou rýchlosťou:

@Bean public IntegrationFlow anotherFileWriter () {return IntegrationFlows.from ("holdingTank") .bridge (e -> e.poller (Pollers.fixedRate (2, TimeUnit.SECONDS, 10))) .handle (anotherTargetDirectory ()) .get (); }

Ako vidíme, jednotlivé mosty môžu ovládať konfiguráciu výziev pre rôzne obslužné programy.

Hneď po načítaní kontextu našej aplikácie máme v akcii zložitejšiu aplikáciu, ktorá začne presúvať súbory zo zdrojového adresára do dvoch cieľových adresárov.

6. Záver

V tomto článku sme videli rôzne spôsoby použitia jarnej integrácie Java DSL na zostavenie rôznych integračných potrubí.

V zásade sa nám podarilo znova vytvoriť aplikáciu na presun súborov z predchádzajúceho tutoriálu, tentokrát pomocou čistej jazyka Java.

Pozreli sme sa tiež na niekoľko ďalších komponentov, ako sú kanály a mosty.

Celý zdrojový kód použitý v tejto príručke je k dispozícii na stránkach Github.


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