Pengantar Apache Camel

1. Ikhtisar

Pada artikel ini, kami akan memperkenalkan Camel dan menjelajahi salah satu konsep intinya - perutean pesan .

Kami akan mulai dengan membahas konsep dan terminologi dasar ini dan kemudian kami akan menyajikan dua opsi utama untuk menentukan rute - Java DSL dan Spring DSL.

Kami juga akan mendemonstrasikan ini pada contoh - dengan menentukan rute yang menggunakan file dari satu folder dan memindahkannya ke folder lain sambil menyiapkan stempel waktu untuk setiap nama file.

2. Tentang Apache Camel

Apache Camel adalah kerangka kerja integrasi sumber terbuka yang dirancang untuk membuat sistem terintegrasi menjadi sederhana dan mudah.

Hal ini memungkinkan pengguna akhir untuk mengintegrasikan berbagai sistem menggunakan API yang sama, memberikan dukungan untuk beberapa protokol dan tipe data, sekaligus dapat diperluas dan memungkinkan pengenalan protokol khusus.

3. Ketergantungan Maven

Untuk menggunakan Camel, pertama-tama kita perlu menambahkan dependensi Maven:

 org.apache.camel camel-core 2.18.0 

Versi terbaru dari artefak Unta dapat ditemukan di sini.

3. Bahasa Khusus Domain

Mesin rute dan perutean adalah bagian sentral dari Camel. Rute berisi aliran dan logika integrasi antara sistem yang berbeda.

Untuk menentukan rute lebih mudah dan bersih, Camel menawarkan beberapa bahasa khusus domain (DSL) yang berbeda untuk bahasa pemrograman seperti Java atau Groovy. Di sisi lain, ini juga menyediakan rute pendefinisian dalam XML dengan Spring DSL.

Menggunakan Java DSL atau Spring DSL sebagian besar merupakan pilihan pengguna, karena sebagian besar fitur tersedia di keduanya.

Java DSL menawarkan lebih banyak fitur yang tidak didukung di Spring DSL. Namun, Spring DSL terkadang lebih bermanfaat karena XML dapat diubah tanpa perlu mengkompilasi ulang kode.

4. Terminologi dan Arsitektur

Sekarang mari kita bahas terminologi dasar dan arsitektur Unta.

Pertama, kita akan melihat konsep inti Unta di sini:

  • Pesan berisi data yang sedang ditransfer ke sebuah rute. Setiap pesan memiliki pengenal unik dan dibuat dari badan, header, dan lampiran
  • Exchange adalah wadah pesan dan dibuat ketika pesan diterima oleh konsumen selama proses perutean. Exchange memungkinkan berbagai jenis interaksi antar sistem - pertukaran dapat menentukan pesan satu arah atau pesan respons-permintaan
  • Endpoint adalah saluran di mana sistem dapat menerima atau mengirim pesan. Ini bisa merujuk ke URI layanan web, URI antrian, file, alamat email, dll
  • Komponen bertindak sebagai pabrik titik akhir. Sederhananya, komponen menawarkan antarmuka ke berbagai teknologi menggunakan pendekatan dan sintaks yang sama. Camel sudah mendukung banyak komponen di DSLs-nya untuk hampir semua teknologi yang memungkinkan, tetapi juga memberikan kemampuan untuk menulis komponen khusus
  • Prosesor adalah antarmuka Java sederhana yang digunakan untuk menambahkan logika integrasi khusus ke rute. Ini berisi metode proses tunggal yang digunakan untuk membentuk logika bisnis kustom pada pesan yang diterima oleh konsumen

Pada tingkat yang tinggi, arsitektur Unta sederhana. CamelContext mewakili sistem runtime Camel dan menghubungkan konsep yang berbeda seperti rute, komponen, atau titik akhir.

Dan di bawahnya, prosesor menangani perutean dan transformasi antara titik akhir, sementara titik akhir mengintegrasikan sistem yang berbeda.

5. Menentukan Rute

Rute dapat ditentukan dengan Java DSL atau Spring DSL.

Kami akan mengilustrasikan kedua gaya dengan menentukan rute yang menggunakan file dari satu folder dan memindahkannya ke folder lain sambil memberikan stempel waktu ke setiap nama file.

5.1. Routing Dengan Java DSL

Untuk menentukan rute dengan Java DSL, pertama-tama kita perlu membuat instance DefaultCamelContext . Setelah itu, kita perlu memperluas kelas RouteBuilder dan mengimplementasikan metode konfigurasi yang akan berisi aliran rute:

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 Metode dapat dibaca seperti ini: membaca file dari folder sumber, proses mereka dengan FileProcessor dan mengirim hasilnya ke folder tujuan. Setting delete = true berarti file akan dihapus dari folder sumber setelah berhasil diproses.

Untuk memulai Camel, kita perlu memanggil metode start di CamelContext . Thread.sleep dipanggil untuk memberi Camel waktu yang diperlukan untuk memindahkan file dari satu folder ke folder lainnya.

FileProcessor mengimplementasikan antarmuka Prosesor dan berisi metode proses tunggal yang berisi logika untuk mengubah nama file:

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 mengambil nama file, kita harus mengambil pesan masuk dari pertukaran dan mengakses headernya. Serupa dengan itu, untuk mengubah nama file, kita harus memperbarui header pesan.

5.2. Routing Dengan Spring DSL

Saat menentukan rute dengan Spring DSL, kami menggunakan file XML untuk menyiapkan rute dan prosesor kami. Hal ini memungkinkan kita untuk mengonfigurasi rute tanpa menggunakan kode dengan menggunakan Spring dan pada akhirnya, memberi kita keuntungan dari kontrol inversi total.

Ini sudah tercakup dalam artikel yang ada, jadi kami akan fokus menggunakan Spring DSL bersama dengan Java DSL, yang biasanya merupakan cara yang lebih disukai untuk menentukan rute.

Dalam pengaturan ini, CamelContext ditentukan dalam file XML Musim Semi menggunakan sintaks XML khusus untuk Camel, tetapi tanpa definisi rute seperti dalam kasus Spring DSL "murni" menggunakan XML:

Dengan cara ini kami memberi tahu Camel untuk menggunakan kelas FileRouter yang menyimpan definisi rute 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 sebuah instance dari ClassPathXmlApplicationContext yang akan memuat CamelContext kita di Spring:

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

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

6. Kesimpulan

Dalam artikel singkat ini, kami menyajikan pengantar Apache Camel dan menunjukkan manfaat menggunakan Camel untuk tugas integrasi seperti merutekan file dari satu folder ke folder lain.

Dalam contoh kami, kami melihat bahwa Camel memungkinkan Anda fokus pada logika bisnis dan mengurangi jumlah kode boilerplate.

Kode dari artikel ini dapat ditemukan di GitHub.