Proljetna integracija Java DSL

1. Uvod

U ovom uputstvu naučit ćemo o Spring DS integraciji Java DSL za stvaranje integracija aplikacija.

Uzet ćemo integraciju za premještanje datoteka koju smo ugradili u Introduction to Spring Integration i umjesto nje upotrijebiti DSL.

2. Ovisnosti

Spring Integration Java DSL dio je Spring Integration Core.

Dakle, možemo dodati tu ovisnost:

 org.springframework.integracija proljeće-integracija-jezgra 5.0.6.OBUSTAVLJANJE 

A za rad na našoj aplikaciji za premještanje datoteka trebat će nam i Spring Integration File:

 org.springframework.integration spring-integracija-datoteka 5.0.6.OSLOBOĐENJE 

3. Proljetna integracija Java DSL

Prije Java DSL-a, korisnici bi konfigurirali komponente Spring Integration u XML.

DSL predstavlja neke tečne graditelje iz kojih lako možemo stvoriti cjeloviti plinovod Spring Integration čisto na Javi.

Dakle, recimo da smo željeli stvoriti kanal koji prepisuje sve podatke koji dolaze kroz cijev.

U prošlosti smo mogli učiniti:

A sada umjesto toga možemo učiniti:

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

4. Aplikacija za premještanje datoteka

Da bismo započeli integraciju datoteka, trebat će nam nekoliko jednostavnih blokova.

4.1. Tok integracije

Prvi blok koji nam treba je integracijski tok koji možemo dobiti iz IntegrationFlow graditelj:

IntegrationFlows.from (...)

iz može potrajati nekoliko vrsta, ali u ovom uputstvu ćemo pogledati samo tri:

  • MessageSources
  • MessageChannels, i
  • Nizs

Uskoro ćemo o sve tri.

Nakon što smo nazvali iz, sada su nam dostupne neke metode prilagodbe:

Protok IntegrationFlow = IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ()) .handle (targetDirectory ()) // dodaj više komponenti .get ();

U konačnici, IntegrationFlow uvijek će stvoriti primjerak IntegrationFlow, što je konačni proizvod bilo koje aplikacije Spring Integration.

Ovaj obrazac uzimanja unosa, izvođenja odgovarajućih transformacija i emitiranja rezultata temeljni je za sve aplikacije Spring Integration.

4.2. Opisivanje ulaznog izvora

Prvo, da bismo premjestili datoteke, morat ćemo našem integracijskom tijeku naznačiti gdje ih treba tražiti, a za to nam treba Izvor poruke:

@Bean public MessageSource sourceDirectory () {// .. izradi izvor poruke}

Jednostavno rečeno, a MessageSource je mjesto odakle mogu dolaziti poruke koje su izvan programa.

Točnije, trebamo nešto što može prilagoditi taj vanjski izvor u predstavljanju poruka za proljeće. I od ovog prilagodba je usredotočena na ulazni, njih se često naziva Ispravljači ulaznih kanala.

The proljeće-integracija-datoteka ovisnost nam daje adapter ulaznog kanala koji je izvrstan za naš slučaj upotrebe: FileReadingMessageSource:

@Bean public MessageSource sourceDirectory () {FileReadingMessageSource messageSource = novi FileReadingMessageSource (); messageSource.setDirectory (nova datoteka (INPUT_DIR)); return messageSource; }

Evo, naša FileReadingMessageSource će čitati direktorij koji daje INPUT_DIR i stvorit će a MessageSource iz toga.

Navedimo ovo kao naš izvor u IntegrationFlows.from zaziv:

IntegrationFlows.from (sourceDirectory ());

4.3. Konfiguriranje ulaznog izvora

Ako o ovome razmišljamo kao o dugovječnoj aplikaciji, vjerojatno ćemo htjeti primijetiti datoteke čim uđu, a ne samo premjestiti datoteke koje su već tamo pri pokretanju.

Da bi se to olakšalo, iz može uzeti i dodatno konfiguratora kao daljnje prilagođavanje ulaznog izvora:

IntegrationFlows.from (sourceDirectory (), configurer -> configurer.poller (Pollers.fixedDelay (10000)));

U ovom slučaju, možemo učiniti naš ulazni izvor otpornijim rekavši Spring Integrationu da anketira taj izvor - u ovom slučaju naš datotečni sustav - svakih 10 sekundi.

I, naravno, ovo se ne odnosi samo na naš izvor unosa datoteke, mogli bismo dodati ovaj alat za praćenje bilo kojem MessageSource.

4.4. Filtriranje poruka iz ulaznog izvora

Dalje, pretpostavimo da želimo da naša aplikacija za premještanje datoteka premješta samo određene datoteke, recimo slikovne datoteke koje imaju jpg produženje.

Za to možemo koristiti GenericSelector:

@Bean public GenericSelector onlyJpgs () {return new GenericSelector () {@Override public boolean accept (Izvor datoteke) {return source.getName (). ENDWith (". Jpg"); }}; }

Pa, obnovimo ponovno naš tok integracije:

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

Ili, jer je ovaj filtar tako jednostavan, mogli bismo ga umjesto toga definirati pomoću lambda:

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

4.5. Rukovanje porukama pomoću servisnih aktivatora

Sad kad imamo filtrirani popis datoteka, moramo ih zapisati na novo mjesto.

Aktivator usluges su ono čemu se okrećemo kada razmišljamo o rezultatima u Spring Integrationu.

Iskoristimo FileWritingMessageHandler aktivator usluge od proljeće-integracija-datoteka:

@Bean public MessageHandler targetDirectory () {FileWritingMessageHandler handler = new FileWritingMessageHandler (nova datoteka (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); povratnik; }

Evo, naša FileWritingMessageHandler napisat će svaki Poruka korisni teret na koji prima IZLAZ_DIR.

Ponovimo, ažurirajmo:

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

I primijetite, usput, upotrebu setExpectReply. Jer integracijski tokovi mogu bitidvosmjerno, ovo pozivanje ukazuje da je ta cijev jednosmjerna.

4.6. Aktiviranje našeg integracijskog toka

Kad smo dodali sve svoje komponente, trebamo registrirajte naš IntegrationFlow kao grah da biste ga aktivirali:

@Bean public IntegrationFlow fileMover () {return IntegrationFlows.from (sourceDirectory (), c -> c.poller (Pollers.fixedDelay (10000))) .filter (onlyJpgs ()) .handle (targetDirectory ()) .get () ; }

The dobiti metoda izdvaja an IntegrationFlow primjerice da se moramo registrirati kao Spring Bean.

Čim se kontekst naše aplikacije učita, sve naše komponente sadržane u našem IntegrationFlow aktivira se.

A sada će naša aplikacija početi premještati datoteke iz izvornog direktorija u ciljni direktorij.

5. Dodatne komponente

U našoj aplikaciji za premještanje datoteka koja se temelji na DSL-u stvorili smo adapter za ulazni kanal, filtar za poruke i aktivator usluge.

Pogledajmo nekoliko drugih uobičajenih komponenti Spring Integration i vidjet ćemo kako bismo ih mogli koristiti.

5.1. Kanali poruka

Kao što je ranije spomenuto, a Kanal za poruke je još jedan način inicijalizacije toka:

IntegrationFlows.from ("anyChannel")

To možemo pročitati kao „pronađite ili izradite grah kanala pod nazivom bilo kojiKanal. Zatim pročitajte sve podatke u koje ste unijeli podatke bilo kojiKanal iz drugih tokova. "

Ali, to je općenitije od toga.

Jednostavno rečeno, kanal apstrahira proizvođače od potrošača i o njemu možemo razmišljati kao o Javi Red. Kanal se može umetnuti u bilo koju točku toka.

Recimo, na primjer, da želimo dati prednost datotekama kada se premještaju iz jednog direktorija u sljedeći:

@Bean public PriorityChannel abecedno () {return new PriorityChannel (1000, (lijevo, desno) -> ((File) left.getPayload ()). GetName (). CompareTo (((File) right.getPayload ()). GetName ())); }

Zatim možemo umetnuti poziv na kanal između našeg protoka:

@Bean public IntegrationFlow fileMover () {return IntegrationFlows.from (sourceDirectory ()) .filter (onlyJpgs ()) .channel ("abecedno") .handle (targetDirectory ()) .get (); }

Postoji na desetke kanala s kojih možete izabrati, neki od onih zgodnijih služe za istodobnost, reviziju ili srednju postojanost (mislite na Kafka ili JMS međuspremnike).

Također, kanali mogu biti moćni u kombinaciji s Mosts.

5.2. Most

Kad želimo kombinirati dva kanala, koristimo a Most.

Zamislimo da umjesto da direktno pišemo u izlazni direktorij, umjesto toga imamo aplikaciju za premještanje datoteka da napiše drugi kanal:

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

Budući da smo to jednostavno napisali na kanalu, odatle možemo premostiti druge tokove.

Stvorimo most koji anketira naš spremnik za poruke i zapisuje ih na odredište:

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

Opet, jer smo pisali na srednji kanal, sada možemo dodati još jedan tok koji uzima te iste datoteke i zapisuje ih različitom brzinom:

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

Kao što vidimo, pojedinačni mostovi mogu kontrolirati konfiguraciju glasanja za različite rukovatelje.

Čim se učita kontekst naše aplikacije, sada imamo složeniju aplikaciju na djelu koja će početi premještati datoteke iz izvornog direktorija u dva ciljna direktorija.

6. Zaključak

U ovom smo članku vidjeli razne načine korištenja Spring Integration Java DSL za izgradnju različitih integracijskih cjevovoda.

U osnovi, uspjeli smo ponovno stvoriti aplikaciju za premještanje datoteka iz prethodnog vodiča, ovaj put koristeći čistu javu.

Također, pogledali smo i nekoliko drugih komponenata poput kanala i mostova.

Kompletni izvorni kod korišten u ovom vodiču dostupan je na Githubu.


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