Aplikasi ini menggunakan Apache Camel yang dijalankan di Spring Boot. Di sini kita akan membuat server REST. Anda tak perlu memahami dulu secara mendalam apa itu komponen SEDA serta method process() pada router Camel. Yang paling perlu dipahami di sini adalah bagaimana data yang dikirimkan oleh client mengalir di dalam router Camel yang kita buat hingga akhirnya data dikirimkan kembali ke client sebagai response Rest.
Kita akan membuat dua buah service REST yaitu:
- Service ambilPesan dengan URL: http://localhost:8881/serviceRest/ambilPesan
- Service operasiTambah dengan URL: http://localhost:8881/serviceRest/operasiTambah
Pertama-tama kita perlu komponen netty-http. Komponen ini digunakan sebagai HTTP Server. Untuk itu kita tambahkan dependency netty-http pada pom.xml kita.
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty-http-starter</artifactId>
<version>x.x.x</version>
<!-- Gunakan versi yang sama dengan Camel Core yang digunakan -->
</dependency>
Selain itu kita akan menggunakan project lombok untuk meng-generate getter dan setter secara otomatis pada kelas-kelas DTO yang digunakan untuk request dan response service REST ini. Untuk itu ditambahkan pula dependency project lombok ini ke dalam pom.xml.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
Kita gunakan pula library camel-jackson untuk agar bisa menggunakan anotasi @JsonIgnoreProperties pada kelas DTO request. Fungsinya untuk menghidari terjadinya exception apabila pada json yang dikirimkan oleh client terdapat field-field yang tidak tersedia dalam kelas DTO request yang kita buat. Tambahkan dependency camel-jackson pada pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>x.x.x</version>
<!-- Gunakan versi yang sama dengan Camel Core yang digunakan -->
</dependency>
Sekarang kita buat komponen paling penting dalam Camel yaitu Router Camel. Pada router Camel ini kita akan gunakan REST DSL. Ini adalah kelas lengkapnya:
package id.co.firman;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.rest.RestBindingMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import id.co.firman.dto.PesanReq;
import id.co.firman.dto.TambahReq;
import id.co.firman.process.AmbilPesanProcess;
import id.co.firman.process.TambahProcess;
@Component
public class RestRouter extends RouteBuilder {
@Autowired
private AmbilPesanProcess getDataStatisProcess;
@Autowired
private TambahProcess tambahProcess;
@Override
public void configure() throws Exception {
// Konfigurasi untuk menggunakan netty-http
restConfiguration().component("netty-http").host("0.0.0.0").port(8881)
.bindingMode(RestBindingMode.json);
// penggunaan rest DSL
rest("/serviceRest")
.post("/ambilPesan").consumes("application/json").produces("application/json")
.type(PesanReq.class).to("seda:router_Jenis_Get")
.post("/operasiTambah").consumes("application/json").produces("application/json")
.type(TambahReq.class).to("seda:router_OperasiTambah");
from("seda:router_Jenis_Get").process(getDataStatisProcess);
from("seda:router_OperasiTambah").process(tambahProcess);
}
}
Bagian pertama dari router ini adalah konfigurasi rest server yang akan dibuat. Pada konfigurasi ini digunakan komponen netty-http yang akan dipublish pada semua inteface yang tersedia (ini ditandai dengan ip: 0.0.0.0) dan menggunakan port 8881. Semua request yang masuk ke port ini akan ditangani sebagai message JSON. Ini ditandai dengan method bindingMode(RestBindingMode.json).
// Konfigurasi untuk menggunakan netty-http
restConfiguration().component("netty-http").host("0.0.0.0").port(8881)
.bindingMode(RestBindingMode.json);
Pada bagian berikutnya adalah penerapan REST-DSL yang ditandai dengan rest(“/serviceRest”). Ini artinya prefix URL yang diekspose adalah /serviceRest. Sampai titik ini artinya server rest yang kita buat dieksponse pada url: http://x.x.x.x:8881/serviceRest/
// penggunaan rest DSL
rest("/serviceRest")
Bagian selanjutnya dari REST-DSL ini terdapat method post(“/ambilPesan”). Ini artinya apabila ada request http dari client dengan menggunakan method POST dan URL yang dituju adalah http://x.x.x.x:8881/serviceRest/ambilPesan, maka request ini akan ditangkap oleh bagian ini. Message request yang diterima akan ditangani sebagai JSON. Semua request JSON ini akan dipetakan ke dalam kelas PesanReq. Selanjutnya object PesanReq ini disimpan dalam Exchange.in.body. Exchange ini akan diteruskan ke dalam router yang menggunakan komponen seda:router_Jenis_Get.
.post("/ambilPesan").consumes("application/json").produces("application/json")
.type(PesanReq.class).to("seda:router_Jenis_Get")
Ketika data masuk ke router dengan komponen seda:router_Jenis_Get, selanjutnya Exchange ini akan diproses oleh getDataStatisProcess yang merupakan object dari kelas AmbilPesanProcess.
from("seda:router_Jenis_Get").process(getDataStatisProcess);
Berikutnya kita lihat apa yang terjadi dalam kelas AmbilPesanProcess. Ketika data masuk ke dalam kelas AmbilPesanProcess, maka method process() dalam kelas ini akan secara otomatis dieksekusi. Perlu diingat bahwa selama dalam Router Camel data request yang dikirimkan oleh client sebetulnya disimpan dalam body Exchange. Tepatnya data request dari client akan disimpan di dalam Exchange.in.body. Oleh karena itu dalam method process() ini kita ambil dahulu data dari client dengan cara:
PesanReq requestData = exchange.getIn().getBody(PesanReq.class);
Selanjutnya kita ambil nilai dari variabel nama dengan cara:
String nama = requestData.getNama();
Lalu dibentuklah object PesanResp yang akan dikirimkan kembali ke client sebagai REST Response. Caranya adalah dengan memasukkan object PesanResp ini ke dalam Exchange.in.body.
exchange.getIn().setBody(response);
Lengkapnya kelas AmbilPesanProcess adalah sebagai berikut:
package id.co.firman.process;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.springframework.stereotype.Component;
import id.co.firman.dto.PesanReq;
import id.co.firman.dto.PesanResp;
@Component
public class AmbilPesanProcess implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
// Ambil data pada exchange body yang merupakan object PesanReq
PesanReq requestData = exchange.getIn().getBody(PesanReq.class);
String nama = requestData.getNama();
PesanResp response = PesanResp.builder()
.kode("7000")
.message("Hallo, "+nama+". Ini pesan statis dari aplikasi REST Camel: DODOL").build();
exchange.getIn().setBody(response);
}
}
Selanjutnya client akan menangkap response ini sebagai JSON.
Berikut adalah contoh penggunakan service ambilPesan ini menggunakan Postman dari sisi client.
Selain method post(“/ambilPesan”) pada REST-DSL ini ada pula method post(“/operasiTambah”). Method ini akan menangkap semua request POST dari client yang menuju ke URL http://x.x.x.x:8881/serviceRest/operasiTambah.
Sama seperti tadi request dari client yang masuk akan ditangani sebagai JSON dan akan dimapping menjadi kelas TambahReq. Selanjutnya object TambahReq ini akan dimasukkan ke dalam Excange.in.body dan Exchange ini akan dikirim ke router yang menggunakan komponen seda:router_OperasiTambah.
.post("/operasiTambah").consumes("application/json").produces("application/json")
.type(TambahReq.class).to("seda:router_OperasiTambah");
Pada router yang menggunakan komponen seda:router_OperasiTambah Exchange ini akan diproses oleh tambahProcess yang merupakan objek dari kelas TambahProcess.
from("seda:router_OperasiTambah").process(tambahProcess);
Di dalam kelas TambahProcess, data dari client diambil dengan cara:
TambahReq requestData = exchange.getIn().getBody(TambahReq.class);
Integer bilanganPertama = requestData.getBilanganPertama();
Integer bilanganKedua = requestData.getBilanganKedua();
Integer hasilPenjumlahan = bilanganPertama + bilanganKedua;
Selanjutnya dibentuklah object kelas TambahResp yang kemudian dimasukkan ke dalam Exchage.in.body untuk selanjutnya dikirimkan kembali ke client sebagai Response.
TambahResp response = TambahResp.builder()
.hasil(hasilPenjumlahan)
.build();
exchange.getIn().setBody(response)
Lengkapnya kelas TambahProcess adalah seperti berikut:
package id.co.firman.process;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.springframework.stereotype.Component;
import id.co.firman.dto.TambahReq;
import id.co.firman.dto.TambahResp;
@Component
public class TambahProcess implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
// Ambil data pada exchange body yang merupakan object TambahReq
TambahReq requestData = exchange.getIn().getBody(TambahReq.class);
Integer bilanganPertama = requestData.getBilanganPertama();
Integer bilanganKedua = requestData.getBilanganKedua();
Integer hasilPenjumlahan = bilanganPertama + bilanganKedua;
TambahResp response = TambahResp.builder()
.hasil(hasilPenjumlahan)
.build();
exchange.getIn().setBody(response);
}
}
Dari sisi client response yang diterima akan berupa message JSON kembali.
Pada REST-DSL selain method POST dapat pula ditambahkan service-service lainnya menggunakan method HTTP lain misalnya GET atau PUT atau yang lainnya.
Source code aplikasi ini bisa diambil di GitHub ini.
Leave a comment