Uvod u Apache Camel

1. Pregled

U ovom ćemo članku predstavite Camel i istražite jedan od njezinih temeljnih koncepata - usmjeravanje poruka.

Započet ćemo pokrivanjem ovih temeljnih koncepata i terminologije, a zatim ćemo predstaviti dvije glavne opcije za definiranje ruta - Java DSL i Spring DSL.

To ćemo pokazati i na primjeru - definiranjem rute koja troši datoteke iz jedne mape i premješta ih u drugu, dodajući vremensku oznaku svakom imenu datoteke.

2. O Apache Camel

Apache Camel je integracijski okvir otvorenog koda osmišljen kako bi integraciju sustava učinio jednostavnom i lakom.

Omogućuje krajnjim korisnicima da integriraju različite sustave koristeći isti API, pružajući podršku za više protokola i tipova podataka, istovremeno proširivi i omogućujući uvođenje prilagođenih protokola.

3. Ovisnosti Mavena

Da bismo koristili Camel, prvo moramo dodati ovisnost Mavena:

 org.apache.deva devina jezgra 2.18.0 

Najnoviju verziju artefakta Camel možete pronaći ovdje.

3. Jezik specifičan za domenu

Rute i motor usmjeravanja središnji su dio Kamile. Rute sadrže tok i logiku integracije između različitih sustava.

Kako bi lakše i čistije definirao rute, Camel nudi nekoliko različitih jezika specifičnih za domenu (DSL) za programske jezike kao što su Java ili Groovy. S druge strane, također pruža definiranje ruta u XML-u s Spring DSL-om.

Upotreba Java DSL-a ili Spring DSL-a uglavnom je korisnička želja, jer je većina značajki dostupna u obje.

Java DSL nudi malo više značajki koje nisu podržane u proljetnom DSL-u. Međutim, Spring DSL je ponekad korisniji jer se XML može mijenjati bez potrebe za ponovnom kompilacijom koda.

4. Terminologija i arhitektura

Razmotrimo sada osnovnu terminologiju i arhitekturu deva.

Prvo ćemo ovdje pogledati osnovne koncepte Camel:

  • Poruka sadrži podatke koji se prenose na rutu. Svaka poruka ima jedinstveni identifikator i izrađena je od tijela, zaglavlja i privitaka
  • Razmjena je spremnik poruke i stvara se kada potrošač primi poruku tijekom postupka usmjeravanja. Exchange omogućuje različite vrste interakcije između sustava - može definirati jednosmjernu poruku ili poruku odgovora na zahtjev
  • Krajnja točka je kanal putem kojeg sustav može primati ili slati poruku. Može se odnositi na URI web usluge, URI reda, datoteku, adresu e-pošte itd
  • Komponenta djeluje kao tvornica krajnjih točaka. Pojednostavljeno rečeno, komponente nude sučelje za različite tehnologije koristeći isti pristup i sintaksu. Camel već podržava puno komponenata u svojim DSL-ovima za gotovo svaku moguću tehnologiju, ali također daje mogućnost pisanja prilagođenih komponenata
  • Procesor je jednostavno Java sučelje koje se koristi za dodavanje prilagođene logike integracije u rutu. Sadrži jednu postupak metoda koja se koristi za izradu prilagođene poslovne logike na poruci koju je primio potrošač

Na visokoj razini, arhitektura deve je jednostavna. CamelContext predstavlja Camel runtime sustav i on povezuje različite koncepte kao što su rute, komponente ili krajnje točke.

I ispod toga, procesori obrađuju usmjeravanje i transformacije između krajnjih točaka, dok krajnje točke integriraju različite sustave.

5. Definiranje rute

Rute se mogu definirati Java DSL-om ili Spring DSL-om.

Ilustrirat ćemo oba stila definirajući rutu koja troši datoteke iz jedne mape i premješta ih u drugu mapu, dodajući vremensku oznaku svakom imenu datoteke.

5.1. Usmjeravanje s Java DSL-om

Da bismo definirali rutu s Java DSL-om, prvo ćemo morati stvoriti DefaultCamelContext primjer. Nakon toga moramo produžiti RouteBuilder razred i implementirati konfigurirati metoda koja će sadržavati tok rute:

privatni statički konačni long DURATION_MILIS = 10000; privatni statički završni niz SOURCE_FOLDER = "src / test / source-folder"; privatni statički završni niz DESTINATION_FOLDER = "src / test / destination-folder"; @Test public void moveFolderContentJavaDSLTest () baca iznimku {CamelContext camelContext = new DefaultCamelContext (); camelContext.addRoutes (new RouteBuilder () {@Override public void configure () baca izuzetak {from ("file: //" + SOURCE_FOLDER + "? delete = true"). process (new FileProcessor ()). to ("file : // "+ DESTINATION_FOLDER);}}); camelContext.start (); Thread.sleep (DURATION_MILIS); camelContext.stop (); }

The konfigurirati metoda može se čitati ovako: čita datoteke iz izvorne mape, obrađuje ih pomoću FileProcessor i rezultat pošaljite u odredišnu mapu. Postavljanje delete = true znači da će se datoteka izbrisati iz izvorne mape nakon uspješne obrade.

Da bismo pokrenuli Camel, moramo nazvati početak metoda na CamelContext. Konac.spavati poziva se kako bi se Camel-u omogućilo vrijeme potrebno za premještanje datoteka iz jedne mape u drugu.

FileProcessor provodi Procesor sučelje i sadrži jedan postupak metoda koja sadrži logiku za izmjenu imena datoteka:

javna klasa FileProcessor implementira Processor {javni void postupak (Exchange razmjena) baca iznimku {String originalFileName = (String) exchange.getIn (). getHeader (Exchange.FILE_NAME, String.class); Datum datuma = novi datum (); SimpleDateFormat dateFormat = novi SimpleDateFormat ("gggg-MM-dd HH-mm-ss"); Niz je promijenioFileName = dateFormat.format (datum) + originalFileName; exchange.getIn (). setHeader (Exchange.FILE_NAME, promijenjenoFileName); }}

Da bismo dohvatili ime datoteke, moramo dohvatiti dolaznu poruku s centrale i pristupiti njenom zaglavlju. Slično tome, da bismo promijenili naziv datoteke, moramo ažurirati zaglavlje poruke.

5.2. Rutiranje s proljetnim DSL-om

Kada definiramo rutu s Spring DSL, koristimo XML datoteku za postavljanje naših ruta i procesora. To nam omogućuje da konfiguriramo rute bez korištenja koda pomoću Springa i na kraju, daje nam prednost potpune inverzije kontrole.

Ovo je već bilo pokriveno u postojećem članku, pa ćemo se usredotočiti na korištenje i Spring DSL-a zajedno s Java DSL-om, što je obično preferirani način definiranja ruta.

U ovom je rasporedu CamelContext definiran u XML datoteci Spring koristeći prilagođenu XML sintaksu za Camel, ali bez definicije rute kao u slučaju "čistog" Spring DSL-a koji koristi XML:

Ovim putem poručujemo Camel-i da koristi FileRouter klasa koja sadrži definiciju naše rute u Java DSL-u:

javna klasa FileRouter proširuje RouteBuilder {private static final String SOURCE_FOLDER = "src / test / source-folder"; privatni statički završni niz DESTINATION_FOLDER = "src / test / destination-folder"; @Override public void configure () baca izuzetak {from ("file: //" + SOURCE_FOLDER + "? Delete = true"). Process (new FileProcessor ()). To ("file: //" + DESTINATION_FOLDER); }}

Da bismo to testirali, moramo stvoriti instancu ClassPathXmlApplicationContext koji će učitati naše CamelContext u proljeće:

@Test public void moveFolderContentSpringDSLTest () baca InterruptedException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext ("camel-context.xml"); Thread.sleep (DURATION_MILIS); applicationContext.close (); }

Korištenjem ovog pristupa dobivamo dodatnu fleksibilnost i pogodnosti koje pruža Spring, kao i sve mogućnosti Java jezika korištenjem Java DSL-a.

6. Zaključak

U ovom kratkom članku predstavili smo uvod u Apache Camel i pokazali prednosti korištenja Camel-a za integracijske zadatke kao što je usmjeravanje datoteka iz jedne mape u drugu.

U našem primjeru vidjeli smo da vam Camel omogućuje da se usredotočite na poslovnu logiku i smanjuje količinu standardnog koda.

Kôd iz ovog članka možete pronaći na GitHubu.