Uvod u proljetne integracije

1. Uvod

Ovaj članak će predstaviti temeljne koncepte proljetne integracije prvenstveno kroz male, praktične primjere.

Spring Integration nudi mnoštvo moćnih komponenata koje mogu uvelike poboljšati međusobnu povezanost sustava i procesa unutar poslovne arhitekture.

Utjelovljuje neke od najfinijih i najpopularnijih dizajnerskih uzoraka, pomažući programerima da izbjegnu samostalno pokretanje.

Pogledat ćemo posebne potrebe koje ova knjižnica ispunjava u poslovnoj aplikaciji i zašto je preporučljiva za neke od njezinih alternativa. Također ćemo razmotriti neke dostupne alate za daljnje pojednostavljivanje razvoja aplikacija temeljenih na Spring Integration.

2. Postavljanje

 org.springframework.integration Spring-Integration-core 4.3.5.RELEASE org.springframework.integration Spring-Integration-file 4.3.5.RELEASE 

Najnovije verzije Spring Integration Core i Spring Integration File Support možete preuzeti s Maven Central.

3. Uzorak poruka

Jedan od temeljnih uzoraka u ovoj knjižnici je Poruke. Uzorak je usredotočen na poruke - diskretne nosivosti podataka koji se premještaju iz izvornog sustava ili procesa u jedan ili više sustava ili procesa putem unaprijed definiranih kanala.

Povijesno gledano, obrazac je nastao kao najfleksibilniji način integriranja više različitih sustava na način koji:

  • Gotovo u potpunosti razdvaja sustave uključene u integraciju
  • Omogućuje sustavima sudionicima u integraciji da budu potpuno agnostični jedni prema drugima u osnovi protokola, oblikovanja ili drugih detalja implementacije
  • Potiče razvoj i ponovnu upotrebu komponenata uključenih u integraciju

4. Integracija poruka na djelu

Razmotrimo osnovni primjer koja kopira MPEG video datoteku iz određene mape u drugu konfiguriranu mapu:

@Configuration @EnableIntegration javna klasa BasicIntegrationConfig {public String INPUT_DIR = "the_source_dir"; javni niz OUTPUT_DIR = "naj_stariji_dir"; javni niz FILE_PATTERN = "* .mpeg"; @Bean public MessageChannel fileChannel () {return new DirectChannel (); } @Bean @InboundChannelAdapter (value = "fileChannel", poller = @Poller (fixedDelay = "1000")) public MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = novi FileReadingMessageSource (); sourceReader.setDirectory (nova datoteka (INPUT_DIR)); sourceReader.setFilter (novi SimplePatternFileListFilter (FILE_PATTERN)); povratak sourceReader; } @Bean @ServiceActivator (inputChannel = "fileChannel") javni MessageHandler fileWritingMessageHandler () {FileWritingMessageHandler handler = novi FileWritingMessageHandler (nova datoteka (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); povratnik; }}

Gornji kod konfigurira aktivator usluge, integracijski kanal i adapter ulaznog kanala.

Uskoro ćemo detaljnije ispitati svaku od ovih vrsta komponenata. The @EnableIntegration anotacija označava ovu klasu kao konfiguraciju Spring Integration.

Započnimo naš kontekst aplikacije Spring Integration:

javna statička void glavna (String ... args) {AbstractApplicationContext context = new AnnotationConfigApplicationContext (BasicIntegrationConfig.class); context.registerShutdownHook (); Skener skenera = novi skener (System.in); System.out.print ("Molimo unesite q i pritisnite za izlaz iz programa:"); while (true) {String input = scanner.nextLine (); if ("q" .equals (input.trim ())) {break; }} System.exit (0); }

Glavna metoda iznad pokreće kontekst integracije; također prihvaća „q”Unos znakova iz naredbenog retka za izlazak iz programa. Ispitajmo komponente detaljnije.

5. Proljetne integracijske komponente

5.1. Poruka

The org.springframework.integracija.Poruka sučelje definira Spring poruku: jedinica prijenosa podataka unutar konteksta Spring Integration.

poruka javnog sučelja {T getPayload (); MessageHeaders getHeaders (); }

Definira pristupnike dvama ključnim elementima:

  • Zaglavlja poruka, u osnovi spremnik ključ / vrijednost koji se može koristiti za prijenos metapodataka, kako je definirano u org.springframework.integration.MessageHeaders razred
  • Korisni teret poruke, a to su stvarni podaci koji vrijede za prijenos - u našem slučaju upotrebe, video datoteka je korisni teret

5.2. Kanal

Kanal u Spring Integration (i zapravo EAI) osnovni je vodovod u integracijskoj arhitekturi. To je cijev kojom se poruke prenose s jednog sustava na drugi.

Možete to shvatiti kao doslovnu cijev kroz koju integrirani sustav ili postupak može potiskivati ​​poruke (ili primati poruke) od drugih sustava.

Kanali u Spring Integration dolaze u raznim okusima, ovisno o vašoj potrebi. Uglavnom se mogu konfigurirati i iskoristiti odmah, bez ikakvog prilagođenog koda, ali ako imate prilagođene potrebe, dostupan je robustan okvir.

Od točke do točke (P2P) kanali se koriste za uspostavljanje komunikacijskih linija 1 do 1 između sustava ili komponenata. Jedna komponenta objavljuje poruku na kanalu kako bi je druga mogla preuzeti. Na svakom kraju kanala može biti samo jedna komponenta.

Kao što smo vidjeli, konfiguriranje kanala jednostavno je poput vraćanja instance DirectChannel:

@Bean public MessageChannel fileChannel1 () {return new DirectChannel (); } @Bean public MessageChannel fileChannel2 () {return new DirectChannel (); } @Bean public MessageChannel fileChannel3 () {return new DirectChannel (); }

Ovdje smo definirali tri odvojena kanala koji su svi identificirani imenom njihovih odgovarajućih getterskih metoda.

Objavi-pretplati (Pub-Sub) kanali se koriste za uspostavljanje komunikacijske linije jedan-prema-više između sustava ili komponenata. To će nam omogućiti objavljivanje na sva 3 izravna kanala koja smo stvorili ranije.

Dakle, slijedeći naš primjer, možemo P2P kanal zamijeniti pub-sub kanalom:

@Bean public MessageChannel pubSubFileChannel () {return new PublishSubscribeChannel (); } @Bean @InboundChannelAdapter (vrijednost = "pubSubFileChannel", poller = @Poller (fixedDelay = "1000")) javni MessageSource fileReadingMessageSource () {FileReadingMessageSource sourceReader = novi FileReadingMessageSource (); sourceReader.setDirectory (nova datoteka (INPUT_DIR)); sourceReader.setFilter (novi SimplePatternFileListFilter (FILE_PATTERN)); povratak sourceReader; } 

Sada smo pretvorili adapter ulaznog kanala za objavljivanje u Pub-Sub kanal. To će nam omogućiti slanje datoteka koje se čitaju iz izvorne mape na više odredišta.

5.3. Most

Most u Spring Integration koristi se za povezivanje dva kanala za poruke ili adaptera ako se iz bilo kojeg razloga ne mogu izravno povezati.

U našem slučaju možemo koristiti most da povežemo naš Pub-Sub kanal s tri različita P2P kanala (jer se P2P i Pub-Sub kanali ne mogu izravno povezati):

@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 (); }

Gornja konfiguracija graha sada premošćuje pubSubFileChannel na tri P2P kanala. The @BridgeFrom anotacija je ono što definira most i može se primijeniti na bilo koji broj kanala koji se trebaju pretplatiti na Pub-Sub kanal.

Gornji kod možemo pročitati kao „stvorite most od pubSubFileChannel do fileChannel1, fileChannel2 i fileChannel3 tako da poruke od pubSubFileChannel mogu se istovremeno napajati na sva tri kanala. "

5.4. Aktivator usluge

Aktivator usluge je bilo koji POJO koji definira @ServiceActivator bilješka na zadanoj metodi. To nam omogućuje izvršavanje bilo koje metode na našem POJO-u kada je poruka primljena s dolaznog kanala i omogućuje nam pisanje poruka na vanjski kanal.

U našem primjeru, naš aktivator usluge prima datoteku od konfiguriranog ulazni kanal i zapisuje ga u konfiguriranu mapu.

5.5. Adapter

Adapter je komponenta temeljena na uzorku poslovne integracije koja omogućuje "priključivanje" na sustav ili izvor podataka. Gotovo je doslovno adapter kakav poznajemo po uključivanju u zidnu utičnicu ili elektronički uređaj.

Omogućuje povezivu povezljivost sa inače "crnim kutijama" sustavima poput baza podataka, FTP poslužitelja i sustava za razmjenu poruka kao što su JMS, AMQP i društvene mreže poput Twittera. Sveprisutnost potrebe za povezivanjem s tim sustavima znači da su adapteri vrlo prijenosni i ponovni za uporabu (zapravo postoji mali katalog adaptera, slobodno dostupan i spreman za upotrebu od strane svih).

Adapteri se dijele u dvije široke kategorije - ulazni i izlazni.

Ispitajmo ove kategorije u kontekstu prilagodnika koji se koriste u našem uzorku scenarija:

Ulazni adapteri, kao što smo vidjeli, koriste se za donošenje poruka s vanjskog sustava (u ovom slučaju direktorija datotečnog sustava).

Naša konfiguracija ulaznog adaptera sastoji se od:

  • An @InboundChannelAdapter napomena koja označava konfiguraciju graha kao adapter - konfiguriramo kanal na koji će adapter prenositi svoje poruke (u našem slučaju MPEG datoteku) i poler, komponenta koja pomaže adapteru u anketiranju konfigurirane mape u određenom intervalu
  • Standardna Java konfiguracijska klasa Spring koja vraća a FileReadingMessageSource, implementacija klase Spring Integration koja obrađuje anketiranje datotečnog sustava

Odlazni adapteri koriste se za slanje poruka prema van. Spring Integration podržava široku paletu gotovih adaptera za razne uobičajene slučajeve upotrebe.

6. Zaključak

Ispitali smo osnovni slučaj korištenja Spring Integracije koji pokazuje konfiguraciju knjižnice na temelju Java-a i ponovnu upotrebu dostupnih komponenti.

Kôd Spring Integration dostupan je kao samostalni projekt u JavaSE-u, kao i dio nečega većeg u Jakarta EE okruženju. Iako se izravno ne natječe s drugim proizvodima i obrascima usmjerenim na EAI, poput Enterprise Service Buses (ESB), održiva je, lagana alternativa rješavanju mnogih istih problema za koje su ESB-ovi izgrađeni da bi ih riješili.

Izvorni kod za ovaj članak možete pronaći u projektu Github.