Introduksjon til Apache Camel

1. Oversikt

I denne artikkelen vil vi introdusere Camel og utforske et av kjernekonseptene sine - meldingsruting.

Vi begynner med å dekke disse grunnleggende konseptene og terminologien, og vi presenterer deretter to hovedalternativer for å definere ruter - Java DSL og Spring DSL.

Vi vil også demonstrere disse på et eksempel - ved å definere en rute som forbruker filer fra en mappe og flytter dem til en annen mens vi forutsetter en tidsstempel til hvert filnavn.

2. Om Apache Camel

Apache Camel er et rammeverk for integrasjon med åpen kildekode designet for å gjøre integreringssystemer enkle og enkle.

Det gjør det mulig for sluttbrukere å integrere forskjellige systemer ved hjelp av samme API, og gir støtte for flere protokoller og datatyper, mens de er utvidbare og tillater innføring av tilpassede protokoller.

3. Maven-avhengigheter

For å kunne bruke Camel, må vi først legge til Maven-avhengigheten:

 org.apache.camel kamelkjerne 2.18.0 

Den siste versjonen av Camel-gjenstanden finner du her.

3. Domenespesifikt språk

Ruter og rutemotor er den sentrale delen av Camel. Ruter inneholder flyt og logikk for integrasjon mellom forskjellige systemer.

For å definere ruter mer enkle og rene, tilbyr Camel flere forskjellige domenespesifikke språk (DSL) for programmeringsspråk som Java eller Groovy. På den annen side gir den også definerende ruter i XML med Spring DSL.

Å bruke enten Java DSL eller Spring DSL er for det meste brukerpreferanse, da de fleste funksjonene er tilgjengelige i begge.

Java DSL tilbyr litt flere funksjoner som ikke støttes i vår DSL. Imidlertid er Spring DSL noen ganger mer gunstig ettersom XML kan endres uten å måtte kompilere koden på nytt.

4. Terminologi og arkitektur

La oss nå diskutere den grunnleggende kamelterminologien og arkitekturen.

Først vil vi ta en titt på de viktigste kamelkonseptene her:

  • Beskjed inneholder data som overføres til en rute. Hver melding har en unik identifikator, og den er konstruert av en kropp, overskrifter og vedlegg
  • Utveksling er beholderen til en melding, og den opprettes når en melding mottas av en forbruker under ruteprosessen. Utveksling tillater forskjellige typer interaksjon mellom systemer - den kan definere en enveismelding eller en forespørselsresponsmelding
  • Endepunkt er en kanal som systemet kan motta eller sende en melding gjennom. Det kan referere til en webtjeneste URI, kø URI, fil, e-postadresse, etc.
  • Komponent fungerer som en sluttpunktsfabrikk. For å si det enkelt, tilbyr komponenter et grensesnitt til forskjellige teknologier ved hjelp av samme tilnærming og syntaks. Camel støtter allerede mange komponenter i DSL-ene for nesten alle mulige teknologier, men det gir også muligheten til å skrive tilpassede komponenter
  • Prosessor er et enkelt Java-grensesnitt som brukes til å legge til tilpasset integrasjonslogikk til en rute. Den inneholder en singel prosess metoden som brukes til å forme tilpasset forretningslogikk på en melding mottatt av en forbruker

På et høyt nivå er arkitekturen til Camel enkel. CamelContext representerer Camel runtime system og det kobler forskjellige konsepter som ruter, komponenter eller endepunkter.

Og under det håndterer prosessorer ruting og transformasjoner mellom endepunkter, mens endepunkter integrerer forskjellige systemer.

5. Definere en rute

Ruter kan defineres med Java DSL eller Spring DSL.

Vi illustrerer begge stilene ved å definere en rute som bruker filer fra en mappe og flytter dem til en annen mappe mens vi forhåndsstemmer et tidsstempel til hvert filnavn.

5.1. Rute med Java DSL

For å definere en rute med Java DSL, må vi først lage en StandardCamelContext forekomst. Etter det må vi utvide RouteBuilder klasse og implementere konfigurere metode som vil inneholde rutestrøm:

privat statisk endelig lang DURATION_MILIS = 10000; privat statisk slutt String SOURCE_FOLDER = "src / test / source-folder"; privat statisk sluttstreng DESTINATION_FOLDER = "src / test / destinasjonsmappe"; @Test offentlig ugyldig moveFolderContentJavaDSLTest () kaster unntak {CamelContext camelContext = ny DefaultCamelContext (); camelContext.addRoutes (ny RouteBuilder () {@ Override public void configure () kaster unntak {fra ("file: //" + SOURCE_FOLDER + "? delete = true"). prosess (ny FileProcessor ()). til ("file : // "+ DESTINATION_FOLDER);}}); camelContext.start (); Thread.sleep (DURATION_MILIS); camelContext.stop (); }

De konfigurere metoden kan leses slik: les filer fra kildemappen, behandler dem med FileProcessor og send resultatet til en destinasjonsmappe. Omgivelser slett = sant betyr at filen vil bli slettet fra kildemappen etter at den er behandlet.

For å starte Camel, må vi ringe start metode på CamelContext. Tråd. Sove blir påkalt for å gi Camel tiden som er nødvendig for å flytte filene fra en mappe til en annen.

FileProcessor redskaper Prosessor grensesnitt og inneholder enkelt prosess metode som inneholder logikk for å endre filnavn:

offentlig klasse FileProcessor implementerer prosessor {public void process (Exchange exchange) kaster unntak {String originalFileName = (String) exchange.getIn (). getHeader (Exchange.FILE_NAME, String.class); Dato dato = ny dato (); SimpleDateFormat dateFormat = ny SimpleDateFormat ("åååå-MM-dd HH-mm-ss"); Streng modifiedFileName = dateFormat.format (date) + originalFileName; exchange.getIn (). setHeader (Exchange.FILE_NAME, modifiedFileName); }}

For å hente filnavnet må vi hente en innkommende melding fra en sentral og få tilgang til overskriften. I likhet med det må vi oppdatere meldingshode for å endre filnavnet.

5.2. Rute med vår DSL

Når vi definerer en rute med Spring DSL, bruker vi en XML-fil for å sette opp ruter og prosessorer. Dette gjør at vi kan konfigurere ruter uten kode ved å bruke Spring og til slutt gir oss fordelen med total inversjon av kontroll.

Dette ble allerede dekket i eksisterende artikkel, så vi vil fokusere på å bruke begge våren DSL sammen med Java DSL, som ofte er en foretrukket måte å definere ruter på.

I denne ordningen er CamelContext definert i XML-fil ved hjelp av tilpasset XML-syntaks for Camel, men uten rutedefinisjonen som i tilfelle "ren" Spring DSL ved bruk av XML:

På denne måten ber vi Camel om å bruke FileRouter klasse som inneholder definisjonen av ruten vår i Java DSL:

offentlig klasse FileRouter utvider RouteBuilder {private static final String SOURCE_FOLDER = "src / test / source-folder"; privat statisk slutt String DESTINATION_FOLDER = "src / test / destinasjonsmappe"; @Override public void configure () kaster unntak {fra ("file: //" + SOURCE_FOLDER + "? Delete = true"). Prosess (ny FileProcessor ()). Til ("file: //" + DESTINATION_FOLDER); }}

For å teste dette, må vi lage en forekomst av ClassPathXmlApplicationContext som vil laste opp vår CamelContext på våren:

@Test offentlig ugyldig moveFolderContentSpringDSLTest () kaster InterruptedException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext ("camel-context.xml"); Thread.sleep (DURATION_MILIS); applicationContext.close (); }

Ved å bruke denne tilnærmingen får vi ekstra fleksibilitet og fordeler som Spring gir, samt alle mulighetene for Java-språk ved å bruke Java DSL.

6. Konklusjon

I denne raske artikkelen presenterte vi en introduksjon til Apache Camel og demonstrerte fordelene ved å bruke Camel til integrasjonsoppgaver som å dirigere filer fra en mappe til en annen.

I vårt eksempel så vi at Camel lar deg fokusere på forretningslogikk og reduserer mengden kjelekode.

Kode fra denne artikkelen finner du på GitHub.


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