Sunday, March 19, 2017

Java HotSwap via Spring Loaded

Pada postingan sebelum nya saya sempat membahas JRebel, yaitu sebuah tools/plugin untuk hot swap pada aplikasi java. Dan kali ini saya akan membahas tentang Spring Loaded, yang bisa dibilang sejenis dengan JRebel karena berfungsi untuk melakukan hot swap.

Spring-loaded adalah sebuah JVM agent untuk reload perubahan pada class sementara JVM running. Spring-loaded memungkinkan kita untuk melakukan hot swap sehingga membantu kita dalam meningkatkan produktivitas dengan mengurangi waktu redeploy.

Experiment

Environment yang saya gunakan untuk percobaan ini adalah:
  • IntelliJ IDEA sebagai IDE 
  • Springboot REST getting started sebagai sample project
  • Maven untuk compile dan running
Langkah pertama adalah kita perlu menambahkan plugin pada pom.xml

Karena akan dirunning via IntelliJ IDEA maka perlu ditambah running configuration dengan menggunakan menu Run > Edit Configurations

Akan muncul window Run/Debug Configuration, dan kita bisa menambahkan konfigurasi running dengan klik icon + pada kiri atas window dan pilih Maven

Maka akan muncul tampilan seperti berikut:


Kita rename nama konfigurasi dengan nama spring-loaded. Isi bagian Command Line dengan spring-boot:run lalu klik OK

Running project dengan klik icon Run pada bagian kanan atas IntelliJ IDEA.

Setelah aplikasi running, kita coba akses REST nya via browser dengan url http://localhost:8080/greeting

Saat nya kita gunakan fitur dari spring-loaded ini, yaitu dengan melakukan perubahan pada code.
Kita rubah class GreetingController.java menjadi seperti berikut:


Selanjutnya kita akan mereload perubahan ini ke aplikasi yang sedang berjalan tanpa harus melakukan restart aplikasi. Caranya dengan meng-compile ulang code sehingga menggenerate file-file .class sesuai dengan code terbaru, yaitu dengan menggunakan menu Build > Make Project

Setelah proses Make Project selesai kita bisa mengecek REST yang tadi via browser. Respon REST yang didapat akan berbeda dengan yang awal, karena kita sudah melakukan perubahan pada code nya.

Proses Make Project memakan waktu yang lebih singkat dibandingkan dengan restart aplikasi. Hal ini karena proses Make Project hanya melakukan compile class java menjadi file .class saja, sedangkan proses start aplikasi nya tidak dilakukan.

Limitation

Setelah saya coba dengan beberapa skenario perubahan code, ternyata spring-loaded memiliki beberapa batasan sehingga perlu dilakukan restart aplikasi. Berikut beberapa batasan yang sudah saya temukan pada percobaan dengan environment di atas:
  • Tidak bisa mengganti value pada @RequestMapping("/greeting"), jadi apa bila kita merubah path atau endpoint /greeting menjadi /hello maka tidak akan bisa ter-reload.
  • Tidak bisa menganti nama method pada rest controller, kita bisa melakukan penambahan method secara langsung pada class controller tetapi untuk method yang sudah terpasang annotation @RequestMapping tidak bisa kita edit.
  • Saat menambahkan class domain baru, harus benar saat pertama kali hot swap, karena perubahan selanjutnya pada class domain tidak akan ter-reload saat hot swap.
Baru sekian skenario yang saya coba, mungkin masih ada beberapa batasan lain dari spring-loaded ini. Dan mungkin juga ada beberapa settingan konfigurasi untuk bisa mengoptimalkan spring-loaded sehingga meminimalisir batasan-batasan tersebut.

Kesimpulan

Bila dibandingkan dengan JRebel, spring-loaded belum bisa menyamai level JRebel. Tetapi mengingat bahwa Jrebel itu berbayar/berlisensi dan hanya memberikan masa trial selama 14 hari saja, spring-loaded yang bersifat free dan juga opensource rasanya lebih bisa diterima meskipun dengan keterbatasannya.

Meskipun pada beberapa case kita perlu restart aplikasi, menggunakan tools hotswap pasti akan lebih mengurangi waktu development dibandingkan dengan cycle normal development (compile & restart).

Jadi kenapa tidak kita gunakan spring-loaded ini selama masa development agar tingkat produktivitas sedikit meningkat.


Referensi:
https://github.com/spring-projects/spring-loaded
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html


No comments:

Post a Comment