Introduktion til Apache Camel

1. Oversigt

I denne artikel vil vi introducer Camel og udforsk et af dets kernekoncepter - routing af meddelelser.

Vi starter med at dække disse grundlæggende begreber og terminologi, og vi præsenterer derefter to hovedmuligheder til at definere ruter - Java DSL og Spring DSL.

Vi vil også demonstrere disse på et eksempel - ved at definere en rute, der forbruger filer fra en mappe og flytter dem til en anden, mens vi forudser et tidsstempel til hvert filnavn.

2. Om Apache Camel

Apache Camel er en open source-integrationsramme designet til at gøre integrationssystemer enkle og lette.

Det giver slutbrugere mulighed for at integrere forskellige systemer ved hjælp af den samme API, hvilket understøtter flere protokoller og datatyper, samtidig med at de kan udvides og tillader indførelsen af ​​brugerdefinerede protokoller.

3. Maven-afhængigheder

For at kunne bruge Camel skal vi først tilføje Maven-afhængigheden:

 org.apache.camel kamelkerne 2.18.0 

Den seneste version af Camel-artefakten kan findes her.

3. Domænespecifikt sprog

Ruter og rutemotor er den centrale del af Camel. Ruter indeholder flowet og logikken i integration mellem forskellige systemer.

For at definere ruter mere lette og rene tilbyder Camel flere forskellige domænespecifikke sprog (DSL) til programmeringssprog som Java eller Groovy. På den anden side giver det også definerende ruter i XML med Spring DSL.

Brug af enten Java DSL eller Spring DSL er for det meste brugerpræference, da de fleste af funktionerne er tilgængelige i begge.

Java DSL tilbyder lidt flere funktioner, som ikke understøttes i Spring DSL. Spring DSL er dog undertiden mere fordelagtigt, da XML kan ændres uden behov for at kompilere koden igen.

4. Terminologi og arkitektur

Lad os nu diskutere den grundlæggende kamelterminologi og arkitektur.

For det første skal vi se på de centrale kamelkoncepter her:

  • Besked indeholder data, der overføres til en rute. Hver besked har en unik identifikator, og den er konstrueret ud af en krop, overskrifter og vedhæftede filer
  • Udveksling er beholderen for en besked, og den oprettes, når en besked modtages af en forbruger under routingsprocessen. Exchange tillader forskellige typer interaktion mellem systemer - det kan definere en envejsbesked eller en anmodning-svarbesked
  • Slutpunkt er en kanal, hvorigennem systemet kan modtage eller sende en besked. Det kan henvise til en webtjeneste URI, kø URI, fil, e-mail-adresse osv
  • Komponent fungerer som en slutpunktsfabrik. For at sige det enkelt, tilbyder komponenter en grænseflade til forskellige teknologier ved hjælp af samme tilgang og syntaks. Camel understøtter allerede mange komponenter i sine DSL'er til næsten enhver mulig teknologi, men det giver også muligheden for at skrive tilpassede komponenter
  • Processor er en simpel Java-grænseflade, der bruges til at tilføje brugerdefineret integrationslogik til en rute. Den indeholder en enkelt behandle metode, der bruges til at præformere brugerdefineret forretningslogik på en besked, der modtages af en forbruger

På et højt niveau er Camel-arkitekturen enkel. CamelContext repræsenterer Camel runtime-systemet, og det fører forskellige koncepter såsom ruter, komponenter eller slutpunkter.

Og under det håndterer processorer routing og transformationer mellem slutpunkter, mens slutpunkter integrerer forskellige systemer.

5. Definition af en rute

Ruter kan defineres med Java DSL eller Spring DSL.

Vi illustrerer begge stilarter ved at definere en rute, der bruger filer fra en mappe og flytter dem til en anden mappe, mens vi forudbestemmer et tidsstempel til hvert filnavn.

5.1. Routing med Java DSL

For at definere en rute med Java DSL skal vi først oprette en StandardCamelContext eksempel. Derefter skal vi udvide RouteBuilder klasse og implementere konfigurere metode, der indeholder rute flow:

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

Det konfigurere metode kan læses sådan: læse filer fra kildemappen, behandler dem med FileProcessor og send resultatet til en destinationsmappe. Indstilling slet = sandt betyder, at filen slettes fra kildemappen, når den er behandlet med succes.

For at starte Camel er vi nødt til at ringe Start metode til CamelContext. Tråd. Sove påberåbes for at give Camel den nødvendige tid til at flytte filerne fra en mappe til en anden.

FileProcessor redskaber Processor interface og indeholder single behandle metode, der indeholder logik til ændring af filnavne:

offentlig klasse FileProcessor implementerer processor {offentlig ugyldig proces (Exchange-udveksling) kaster undtagelse {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 ændretFilnavn = datoFormat.format (dato) + originalFilnavn; exchange.getIn (). setHeader (Exchange.FILE_NAME, ændret filnavn); }}

For at hente filnavnet er vi nødt til at hente en indgående besked fra en central og få adgang til dens overskrift. På samme måde skal vi opdatere beskedens overskrift for at ændre filnavnet.

5.2. Routing med fjeder DSL

Når vi definerer en rute med Spring DSL, bruger vi en XML-fil til at opsætte vores ruter og processorer. Dette giver os mulighed for at konfigurere ruter uden kode ved at bruge Spring og i sidste ende giver os fordelen ved total inversion af kontrol.

Dette var allerede dækket af eksisterende artikel, så vi vil fokusere på at bruge begge Spring DSL sammen med Java DSL, som ofte er en foretrukken måde at definere ruter på.

I dette arrangement er CamelContext defineret i Spring XML-fil ved hjælp af brugerdefineret XML-syntaks til Camel, men uden rutedefinitionen som i tilfældet med "ren" Spring DSL ved hjælp af XML:

På denne måde beder vi Camel om at bruge FileRouter klasse, der indeholder definitionen af ​​vores rute i Java DSL:

offentlig klasse FileRouter udvider RouteBuilder {privat statisk endelig streng SOURCE_FOLDER = "src / test / source-folder"; privat statisk endelig streng DESTINATION_FOLDER = "src / test / destinationsmappe"; @ Override public void configure () kaster undtagelse {fra ("file: //" + SOURCE_FOLDER + "? Delete = true"). Proces (ny FileProcessor ()). Til ("file: //" + DESTINATION_FOLDER); }}

For at teste dette er vi nødt til at oprette en forekomst af ClassPathXmlApplicationContext som vil fylde vores CamelContext om foråret:

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

Ved at bruge denne tilgang får vi yderligere fleksibilitet og fordele, der leveres af Spring, samt alle mulighederne for Java-sprog ved hjælp af Java DSL.

6. Konklusion

I denne hurtige artikel præsenterede vi en introduktion til Apache Camel og demonstrerede fordelene ved at bruge Camel til integrationsopgaver såsom routing af filer fra en mappe til en anden.

I vores eksempel så vi, at Camel lader dig fokusere på forretningslogik og reducerer mængden af ​​kedelpladekode.

Kode fra denne artikel kan findes på GitHub.