Pengenalan unta Apache

1. Gambaran keseluruhan

Dalam artikel ini, kami akan memperkenalkan Camel dan meneroka salah satu konsep utamanya - penghalaan mesej .

Kami akan mulakan dengan merangkumi konsep asas dan terminologi ini dan kemudian kami akan membentangkan dua pilihan utama untuk menentukan laluan - Java DSL dan Spring DSL.

Kami juga akan menunjukkannya pada contoh - dengan menentukan laluan yang menggunakan fail dari satu folder dan memindahkannya ke folder lain sambil menyiapkan cap waktu ke setiap nama fail.

2. Mengenai Apache Camel

Apache Camel adalah kerangka integrasi sumber terbuka yang dirancang untuk menjadikan sistem pengintegrasian mudah dan senang.

Ini memungkinkan pengguna akhir untuk mengintegrasikan berbagai sistem menggunakan API yang sama, memberikan sokongan untuk beberapa protokol dan jenis data, sementara dapat diperluas dan memungkinkan pengenalan protokol khusus.

3. Pergantungan Maven

Untuk menggunakan Camel, kita perlu menambahkan kebergantungan Maven terlebih dahulu:

 org.apache.camel camel-core 2.18.0 

Versi terbaru artifak Camel boleh didapati di sini.

3. Bahasa Khusus Domain

Laluan dan mesin penghala adalah bahagian tengah unta. Laluan mengandungi aliran dan logik integrasi antara sistem yang berbeza.

Untuk menentukan laluan lebih mudah dan bersih, Camel menawarkan beberapa bahasa khusus domain (DSL) untuk bahasa pengaturcaraan seperti Java atau Groovy. Sebaliknya, ia juga menyediakan laluan yang menentukan dalam XML dengan Spring DSL.

Menggunakan Java DSL atau Spring DSL kebanyakannya menjadi pilihan pengguna, kerana kebanyakan ciri terdapat di kedua-duanya.

Java DSL menawarkan lebih banyak ciri yang tidak disokong pada Spring DSL. Walau bagaimanapun, Spring DSL kadang-kadang lebih bermanfaat kerana XML dapat diubah tanpa perlu menyusun semula kodnya.

4. Terminologi dan Senibina

Mari kita bincangkan terminologi dan seni bina unta asas.

Pertama, kita akan melihat konsep inti Unta di sini:

  • Mesej mengandungi data yang sedang dipindahkan ke rute. Setiap mesej mempunyai pengecam unik dan ia dibina dari badan, tajuk, dan lampiran
  • Exchange adalah wadah mesej dan ia dibuat apabila mesej diterima oleh pengguna semasa proses penghalaan. Pertukaran membolehkan pelbagai jenis interaksi antara sistem - ia dapat menentukan mesej sehala atau mesej permintaan-respons
  • Endpoint adalah saluran yang membolehkan sistem menerima atau menghantar mesej. Ia boleh merujuk kepada URI perkhidmatan web, antrian URI, fail, alamat e-mel, dll
  • Komponen bertindak sebagai kilang titik akhir. Sederhananya, komponen menawarkan antara muka untuk teknologi yang berbeza menggunakan pendekatan dan sintaks yang sama. Camel sudah menyokong banyak komponen dalam DSLnya untuk hampir semua teknologi yang mungkin, tetapi juga memberikan kemampuan untuk menulis komponen khusus
  • Processor adalah antara muka Java sederhana yang digunakan untuk menambahkan logika integrasi tersuai ke laluan. Ini mengandungi kaedah proses tunggal yang digunakan untuk membentuk logika perniagaan khusus pada mesej yang diterima oleh pengguna

Pada tahap yang tinggi, seni bina Camel sederhana. CamelContext mewakili sistem runtime Camel dan ia mengangkut konsep yang berbeza seperti laluan, komponen atau titik akhir.

Dan di bawahnya, pemproses menangani penghalaan dan transformasi antara titik akhir, sementara titik akhir mengintegrasikan sistem yang berbeza.

5. Menentukan Laluan

Laluan dapat ditentukan dengan Java DSL atau Spring DSL.

Kami akan menggambarkan kedua-dua gaya dengan menentukan laluan yang menggunakan fail dari satu folder dan memindahkannya ke folder lain sambil menyiapkan cap waktu ke setiap nama fail.

5.1. Laluan Dengan Java DSL

Untuk menentukan laluan dengan Java DSL, pertama-tama kita perlu membuat contoh DefaultCamelContext . Selepas itu, kita perlu memperluas kelas RouteBuilder dan menerapkan kaedah konfigurasi yang akan mengandungi aliran laluan:

private static final long DURATION_MILIS = 10000; private static final String SOURCE_FOLDER = "src/test/source-folder"; private static final String DESTINATION_FOLDER = "src/test/destination-folder"; @Test public void moveFolderContentJavaDSLTest() throws Exception { CamelContext camelContext = new DefaultCamelContext(); camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("file://" + SOURCE_FOLDER + "?delete=true").process( new FileProcessor()).to("file://" + DESTINATION_FOLDER); } }); camelContext.start(); Thread.sleep(DURATION_MILIS); camelContext.stop(); }

The configure kaedah boleh dibaca seperti ini: fail dibaca dari folder sumber, proses mereka dengan FileProcessor dan menghantar hasil ke folder destinasi. Menetapkan delete = true bermaksud fail akan dihapus dari folder sumber setelah berjaya diproses.

Untuk memulakan Camel, kita perlu memanggil kaedah mula di CamelContext . Thread.sleep dipanggil untuk membolehkan Camel masa yang diperlukan untuk memindahkan fail dari satu folder ke folder lain.

FileProcessor menerapkan antara muka Prosesor dan mengandungi kaedah proses tunggal yang mengandungi logik untuk mengubah nama fail:

public class FileProcessor implements Processor { public void process(Exchange exchange) throws Exception { String originalFileName = (String) exchange.getIn().getHeader( Exchange.FILE_NAME, String.class); Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH-mm-ss"); String changedFileName = dateFormat.format(date) + originalFileName; exchange.getIn().setHeader(Exchange.FILE_NAME, changedFileName); } }

Untuk mendapatkan nama fail, kita harus mengambil mesej masuk dari bursa dan mengakses tajuknya. Sama seperti itu, untuk mengubah nama fail, kita harus mengemas kini tajuk mesej.

5.2. Laluan Dengan Spring DSL

Semasa menentukan laluan dengan Spring DSL, kami menggunakan fail XML untuk mengatur laluan dan pemproses kami. Ini membolehkan kita mengkonfigurasi laluan tanpa kod dengan menggunakan Musim Semi dan akhirnya, memberi kita kelebihan kawalan terbalik.

Ini sudah dibahas dalam artikel yang ada, jadi kami akan fokus pada penggunaan kedua Spring DSL bersama dengan Java DSL, yang biasanya merupakan cara yang disukai untuk menentukan rute.

Dalam pengaturan ini, CamelContext didefinisikan dalam fail XML Spring menggunakan sintaks XML khusus untuk Camel, tetapi tanpa definisi laluan seperti dalam kasus DSL Spring "murni" menggunakan XML:

Dengan cara ini kita memberitahu Camel untuk menggunakan kelas FileRouter yang memegang definisi laluan kami di Java DSL:

public class FileRouter extends RouteBuilder { private static final String SOURCE_FOLDER = "src/test/source-folder"; private static final String DESTINATION_FOLDER = "src/test/destination-folder"; @Override public void configure() throws Exception { from("file://" + SOURCE_FOLDER + "?delete=true").process( new FileProcessor()).to("file://" + DESTINATION_FOLDER); } }

Untuk menguji ini, kita harus membuat contoh ClassPathXmlApplicationContext yang akan memuatkan CamelContext kami pada Spring:

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

Dengan menggunakan pendekatan ini, kita mendapatkan fleksibiliti dan manfaat tambahan yang diberikan oleh Spring, serta semua kemungkinan bahasa Java dengan menggunakan Java DSL.

6. Kesimpulannya

Dalam artikel ringkas ini, kami menyampaikan pengenalan tentang Apache Camel dan menunjukkan manfaat menggunakan Camel untuk tugas-tugas integrasi seperti merutekan file dari satu folder ke folder lain.

Dalam contoh kami, kami melihat bahawa Camel membolehkan anda memberi tumpuan kepada logik perniagaan dan mengurangkan jumlah kod plat boiler.

Kod dari artikel ini boleh didapati di GitHub.