Apache Camel s proljetnim čizmama

1. Pregled

U svojoj osnovi, Apache Camel je integracijski motor koji se, jednostavno rečeno, može koristiti za olakšavanje interakcije između širokog i raznolikog niza tehnologija.

Ti se mostovi između usluga i tehnologija nazivaju rute. Rute su implementirane na motoru ( CamelContext), a komuniciraju s takozvanim "razmjenskim porukama".

2. Ovisnosti Mavena

Za početak ćemo morati uključiti ovisnosti za Spring Boot, Camel, Rest API sa Swaggerom i JSON:

  org.apache.camel camel-servlet-starter $ {camel.version} org.apache.camel camel-jackson-starter $ {camel.version} org.apache.camel camel-swagger-java-starter $ {camel.version} org.apache.camel camel-spring-boot-starter $ {camel.version} org.springframework.boot spring-boot-starter-web $ {spring-boot-starter.version} 

Najnovije verzije ovisnosti o Apache Camel možete pronaći ovdje.

3. Glavna klasa

Prvo napravimo Spring Boot Primjena:

@SpringBootApplication @ComponentScan (basePackages = "com.baeldung.camel") aplikacija javne klase {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}

4. Konfiguracije deve za proljetni čizma

Konfigurirajmo sada našu aplikaciju s Springom, počevši od konfiguracijskih datoteka (svojstava).

Na primjer, konfigurirajmo zapisnik za našu aplikaciju na primjena.svojstva uloži u src / glavni / resursi:

logging.config = classpath: logback.xml camel.springboot.name = MyCamel server.address = 0.0.0.0 management.address = 0.0.0.0 management.port = 8081 endpoints.enabled = true endpoints.health.enabled = true

Ovaj primjer pokazuje primjena.svojstva datoteka koja također postavlja put do konfiguracije zabilježbe. Postavljanjem IP-a na "0.0.0.0", u potpunosti ograničavamo admin i upravljanje pristup na web poslužitelju koji pruža Spring Boot. Također, omogućujemo potreban mrežni pristup krajnjim točkama naše aplikacije kao i krajnjim točkama provjere stanja.

Druga konfiguracijska datoteka je primjena.iml. U nju ćemo dodati neka svojstva koja nam pomažu ubrizgati vrijednosti u naše rute aplikacije:

poslužitelj: port: 8080 deva: springboot: ime: ServicesRest management: port: 8081 krajnje točke: omogućeno: lažno zdravlje: omogućeno: istinski brzi početak: generirajOrderPeriod: 10s processOrderPeriod: 30s

5. Postavljanje Serveta od deva

Jedan od načina da počnete koristiti Camel je da ga registrirate kao servlet, tako da može presresti HTTP zahtjeve i preusmjeriti ih u našu aplikaciju.

Kao što je već spomenuto, zagledani u Camelinu verziju 2.18 i niže možemo iskoristiti našu primjena.iml - stvaranjem parametra za naš završni URL. Kasnije će se ubrizgati u naš Java kôd:

baeldung: api: path: '/ deva'

Povratak na naš Primjena klase, moramo registrirati Camel servlet u korijenu našeg kontekstnog puta, koji će se ubrizgati iz reference baeldung.api.path u primjena.iml kada se aplikacija pokrene:

@Value ("$ {baeldung.api.path}") String contextPath; @Bean ServletRegistrationBean servletRegistrationBean () {ServletRegistrationBean servlet = novi ServletRegistrationBean (novi CamelHttpTransportServlet (), contextPath + "/ *"); servlet.setName ("CamelServlet"); povratni servlet; }

Od Cameline verzije 2.19, ova je konfiguracija odbačena kao CamelServlet je prema zadanim postavkama postavljeno na "/deva".

6. Izgradnja rute

Počnimo s izradom rute produžujući RouteBuilder klase od Camel i postavi ga kao a @Komponenta tako da ga rutina skeniranja komponenata može pronaći tijekom inicijalizacije web poslužitelja:

Klasa @Component RestApi proširuje RouteBuilder {@Override public void configure () {CamelContext context = new DefaultCamelContext (); restConfiguration () ... rest ("/ api /") ... from ("direct: remoteService") ...}}

U ovoj klasi prevladavamo konfigurirati() metoda iz Camel's RouteBuilder razred.

Deva uvijek treba CamelContext primjer - osnovna komponenta u kojoj se čuvaju dolazne i odlazne poruke.

U ovom jednostavnom primjeru, DefaultCamelContext dovoljno je jer na nju samo veže poruke i rute, poput REST usluge koju ćemo stvoriti.

6.1. The restConfiguration () Ruta

Dalje, kreiramo REST deklaraciju za krajnje točke koje planiramo stvoriti u restConfiguration () metoda:

restConfiguration () .contextPath (contextPath) .port (serverPort) .enableCORS (true) .apiContextPath ("/ api-doc") .apiProperty ("api.title", "Test REST API") .apiProperty ("api.version "," v1 ") .apiContextRouteId (" doc-api ") .component (" servlet ") .bindingMode (RestBindingMode.json)

Ovdje registriramo put konteksta s našim ubačenim atributom iz YAML datoteke. Ista logika primijenjena je na priključak naše aplikacije. Omogućen je CORS, koji omogućuje upotrebu web stranica na više web lokacija. Način vezanja omogućuje i pretvara argumente u naš API.

Dalje, dodamo Swaggerovu dokumentaciju URI-ju, naslovu i verziji koje smo prethodno postavili. Kako stvaramo metode / krajnje točke za našu REST web uslugu, Swagger dokumentacija automatski će se ažurirati.

Ovaj Swaggerov kontekst sam je put Camel, a neke tehničke informacije o njemu možemo vidjeti u zapisniku poslužitelja tijekom postupka pokretanja. Naš primjer dokumentacije prema zadanim postavkama poslužuje se na // localhost: 8080 / camel / api-doc.

6.2. The odmor() Ruta

Sada, provedimo odmor() poziv metode iz konfigurirati() gore navedena metoda:

rest ("/ api /") .id ("api-route") .consumes ("application / json") .post ("/ bean") .bindingMode (RestBindingMode.json_xml) .type (MyBean.class) .to ("izravno: remoteService");

Ova metoda je prilično jednostavna za one koji poznaju API-je. The iskaznica je identifikacija rute unutar CamelContext. Sljedeći redak definira MIME tip. Način vezivanja ovdje je definiran kako bi pokazao da možemo postaviti način rada na restConfiguration ().

The objaviti () metoda dodaje operaciju API-ju, generirajući "POŠTA / grah”Krajnja točka, dok je MyBean (redoviti Java grah s Cijeli broj id i Ime niza) definira očekivane parametre.

Slično tome, HTTP radnje poput GET, PUT i DELETE dostupne su u obliku dobiti(), staviti(), izbrisati().

Napokon, do() metoda stvara most do druge rute. Ovdje govori Camelu da pretraži unutar svog konteksta / motora drugu rutu koju ćemo stvoriti - koja je imenovana i otkrivena vrijednošću / id “direktno: …“, Podudaranje s rutom definiranom u iz() metoda.

6.3. The iz() Ruta sa transformirati()

Kada radite s Camel, ruta prima parametre, a zatim ih pretvara, transformira i obrađuje. Nakon toga, šalje ove parametre na drugu rutu koja rezultat prosljeđuje na željeni izlaz (datoteku, bazu podataka, SMTP poslužitelj ili REST API odgovor).

U ovom članku samo kreiramo drugu rutu unutar konfigurirati() metoda koju nadjačavamo. To će biti odredište za naš posljednji do() ruta:

from ("direct: remoteService") .routeId ("direct-route") .tracing () .log (">>> $ {body.id}") .log (">>> $ {body.name}" ) .transform (). simple ("Hello $ {in.body.name}") .setHeader (Exchange.HTTP_RESPONSE_CODE, konstanta (200));

The iz() metoda slijedi iste principe i ima mnoge iste metode kao i odmor() metoda, osim što troši iz kontekstualnih poruka Camel. To je razlog za parametar “izravna ruta“, Koji stvara vezu na gore spomenutu metodu odmor (). do ().

Dostupne su mnoge druge pretvorbe, uključujući izdvajanje kao Java primitive (ili objekte) i slanje na sloj postojanosti. Primijetite da se rute uvijek čitaju iz dolaznih poruka, tako da će lančane rute ignorirati odlazne poruke.

Naš je primjer spreman i možemo ga isprobati:

  • Pokrenite naredbu prompt: mvn spring-boot: trčanje
  • Pošaljite POST zahtjev za // localhost: 8080 / deva / api / grah s parametrima zaglavlja: Vrsta sadržaja: application / jsoni korisni teret {"Id": 1, "name": "Svijet"}
  • Trebali bismo dobiti povratni kôd 201 i odgovor: Pozdrav svijete

6.4. JEDNOSTAVNI skriptni jezik

Primjer daje zapise pomoću praćenje () metoda. Primijetite da smo koristili ${} rezervirana mjesta; ovo su dio skriptnog jezika koji pripada Camel-u pod nazivom SIMPLE. Primjenjuje se na poruke koje se razmjenjuju tijekom rute, poput tijela poruke.

U našem primjeru koristimo SIMPLE za ispis u zapis atributa graha koji se nalaze unutar tijela poruke Camel.

Također ga možemo koristiti za jednostavne transformacije, kao što je prikazano s transformirati() metoda.

6.5. The iz() Ruta sa postupak()

Učinimo nešto značajnije, poput pozivanja sloja usluge za vraćanje obrađenih podataka. SIMPLE nije namijenjen teškoj obradi podataka, pa zamijenimo transformirati() s postupak() metoda:

from ("direct: remoteService") .routeId ("direct-route") .tracing () .log (">>> $ {body.id}") .log (">>> $ {body.name}" ) .process (novi procesor () {@ Override javni void postupak (Exchange exchange) baca iznimku {MyBean bodyIn = (MyBean) exchange.getIn (). getBody (); ExampleServices.example (bodyIn); exchange.getIn (). setBody (bodyIn);}}) .setHeader (Exchange.HTTP_RESPONSE_CODE, konstanta (200));

To nam omogućuje izdvajanje podataka u grah, isti onaj koji je prethodno definiran na tip() metodu i obradite je u našoj ExampleServices sloj.

Budući da smo postavili bindingMode () na JSON ranije, odgovor je već u ispravnom JSON formatu, generiran na temelju našeg POJO-a. To implicira da za ExampleServices razred:

javna klasa ExampleServices {javni statični primjer praznine (MyBean bodyIn) {bodyIn.setName ("Zdravo," + bodyIn.getName ()); bodyIn.setId (bodyIn.getId () * 10); }}

Isti se HTTP zahtjev sada vraća s kodom odgovora 201 i tijelom: {"Id": 10, "name": "Zdravo, Svijete"}.

7. Zaključak

S nekoliko redaka koda uspjeli smo stvoriti relativno cjelovitu aplikaciju. Sve se ovisnosti grade, upravljaju i automatski izvode jednom naredbom. Štoviše, možemo stvoriti API-je koji povezuju sve vrste tehnologija.

Ovaj pristup također je vrlo pogodan za spremnike, što rezultira vrlo mršavim poslužiteljskim okruženjem koje se lako može kopirati na zahtjev. Dodatne mogućnosti konfiguracije mogu se jednostavno uključiti u datoteku za konfiguraciju predloška spremnika.

Ovaj REST primjer možete pronaći na GitHubu.

Napokon, izvan okvira filtar(), postupak(), transformirati(), i maršal () API-ji, mnogi drugi obrasci integracije i manipulacije podacima dostupni su u Camel:

  • Uzorci integracije deva
  • Korisnički priručnik za Camel
  • Deva JEDNOSTAVNI jezik

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