Apa itu Asynchronous Program?
Asynchronous program adalah cara menulis kode non-pemblokiran dengan menjalankan tugas pada thread yang terpisah (dimana unit kerja berjalan secara terpisah) dari thread aplikasi utama dan memberitahu thread utama tentang progres, penyelesaian, atau kegagalan.
Mari kita pahami dengan sebuah contoh....
Artikel Berita:
Misalnya, kita memiliki produk yang membawa informasi yang relevan kepada pelanggan seperti berita bisnis, informasi saham, dll. Salah satu modul produk ini adalah membuang berita dari berbagai sumber dan memahami kontennya, yang berarti kita akan mengekstraksi berbagai artikel berita, informasi saham dari berbagai sumber, Yahoo, Business Insider, Reuters, dll.
Disini kita perlu menghubungi banyak layanan di internet untuk mendapatkan berita yang relevan bagi pelanggan. Apa yang tidak ingin kita lakukan adalah memblokir proses perhitungan untuk mendapatkan informasi yang relevan dari layanan di atas. Misalnya, kita tidak perlu menunggu data dari Yahoo Finance untuk mulai memproses data yang berasal dari Business Insider. Ini merupakan sisi lain dari multitask-programming. Sebaliknya yang benar-benar ingin kita capai adalah menghindari pemblokiran thread dan membuang-buang komputasi resources sambil menunggu yang mungkin cukup lama untuk mendapatkan sebuah result dari remote service atau dari interogasi basis data.
CompletableFuture
Digunakan untuk pemrograman asynchronous di Java. CompletableFuture diperkenalkan di Java 8 yang menyediakan abstraksi untuk tugas async dalam pemrograman event driven. Ini biasanya ditujukan untuk menjalankan operasi yang berjalan lama (http request, query database, operasi file atau perhitungan yang rumit).
CompletableFuture memiliki 2 manfaat utama:
- Ini dapat diselesaikan secara eksplisit dengan memanggil method complete() tanpa menunggu yang sinkron. Ini memungkinkan nilai jenis apapun avalaible in future dengan nilai kembalian default, meskipun komputasi tidak selesai, menggunakan hasil default/intermediate results.
- Dengan puluhan metode baru, juga memungkinkan kita untuk membangun pipeline data process dalam serangkaian action. Kita dapat menemukan sejumlah pola untuk CompletableFutures seperti membuat CompletableFuture dari sebuah task.
Berikut intro dari pengertian Asynchronous dan CompletableFuture, sekarang kita akan memasuki demonstrasi dari Asynchronous Program with CompletableFuture.
Create representasi dari GitHub User
Untuk memodelkan representasi pengguna, kita membuat kelas representasi resources. Menyediakan objek Java biasa fields, constructors, and accessors:
src/main/java/hello/User.java
Spring menggunakan library Jackson JSON untuk mengonversi respon JSON GitHub ke dalam objek User. Anotasi @JsonIgnoreProperties digunakan untuk mengabaikan atribut apapun yang tidak tercantum di kelas. Ini akan membuat kita mudah untuk panggilan REST dan menghasilkan objek domain. Disini kita akan mengambil nama dan URL blog.
Create GitHubLookupService
Selanjutnya, kita perlu membuat sebuah service query GitHub untuk menemukan informasi user.
src/main/java/hello/GitHubLookupService.java
Kelas GitHubLookupService menggunakan Spring's RestTemplate untuk memanggil point REST, lalu mengonversi responnya menjadi objek User. Spring Boot secara otomatis menyediakan RestTemplateBuilder yang mengkustomisasi default dengan bit konfigurasi otomatis (yaitu MessageConverter).
Metode findUser ditandai dengan anotasi @AsyncSpring, yang menunjukkan bahwa proses akan berjalan pada thread yang terpisah. Jenis pengembalian method adalah CompletableFuture<User> sebagai pengganti User, persyaratan untuk asynchronous service. Code ini menggunakan metode completionFuture untuk mengembalikan instance CompletableFuture yang sudah selesai dengan hasil query GitHub.
Ada juga CommandLineRunner yang meng-inject GitHubLookupService dan memanggil service tersebut 3 kali untuk menunjukkan bahwa method dijalankan secara asynchronous.
src/main/java/hello/AppRunner.java
Kesimpulan:
Kita baru saja mengembangkan service asinkron yang memungkinkan kita untuk meningkatkan multiple calls at once (dapat menjalankan beberapa proses sekaligus).
References:
- https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html
- https://spring.io/guides/gs/async-method/
- https://www.baeldung.com/java-completablefuture
- https://coding2fun.wordpress.com/2016/08/09/asynchronous-programming-in-java/
- https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/client/RestTemplateBuilder.html
No comments:
Post a Comment