Sunday, September 18, 2016

Spring Boot Scheduling Task

Secara garis besar ada 2 pilihan untuk memenuhi kebutuhan akan scheduler, yaitu menggunakan Cron atau membuat aplikasi scheduler. Untuk memutuskan akan menggunakan pilihan yang mana, saya melakukan sebuah perbandingan antara crontab dengan aplikasi scheduler (java).

Aplikasi Crontab
Running on JVM Running on OS
Consume Memory Consume Less Memory
Database atau File Properties File System OS
Cron Trigger & Simple Trigger Cron Trigger
Running Logic Call Application

Running on JVM vs Running on OS

Seperti yang sudah diketahui oleh kita semua bahwa aplikasi java tidak bisa berjalan tanpa adanya Java Virtual Machine (JVM). Maka bisa dibilang jika aplikasi java kurang bersifat native karena ada JVM yang menjadi penghubung aplikasi dengan OS. Sedangkan Cron yang bersifat native sehingga bisa langsung berjalan di atas OS.

Memory Consumption

Karena java membutuhkan JVM untuk bisa running pada server, maka kita perlu menyediakan RAM untuk JVM. Sehingga alokasi RAM yg diperlukan adalah untuk JVM ditambah aplikasi scheduler itu sendiri. Berbeda dengan Cron yang memang bersifat native, sehingga penggunaan RAM nya lebih kecil karena hanya untuk Cron itu sendiri saja.

Schedule Resource

Sumber penjadwalan yang menjadi acuan kapan sebuah job/task dijalankan itu beragam. Pada aplikasi java, kita bisa menglakukan hardcode didalam aplikasi, menggunakan file properties, atau table pada database agar perubahan pada jadwalnya bisa dibaca langsung oleh aplikasi. Sedangkan pada Cron ada yang disebut dengan Crontab (Crontable), yaitu sumber data untuk penjadwalan kapan job/task dijalankan oleh Cron.

Jenis Schedule Trigger

Pada Crontab kita harus menuliskan schedule dalam suatu format yaitu Cron Trigger seperti berikut:


Sedangkan pada aplikasi yang kita develop sendiri, kita bebas menetukan bentuk format schedule nya. Mungkin saja menggunakan Simple Trigger seperti satuan jumlah second atau milisecond sebagai interval antara running task. Bisa juga kita mendefinisikan apikasi akan membaca format Cron Trigger.

Running Logic vs Call Application

Apabila kita membuat sebuah aplikasi scheduler, kita bisa menanamkan sebuah logic untuk pengolah data secara langsung oleh aplikasi tersebut. Tetapi pada Cron, hal ini tidak bisa, karena Cron hanya digunakan untuk mengeksekusi sebuah script/command terminal yang biasanya tidak mengandung logic pengolahan data. Jadi apabila diperlukan pengolahan data, maka Cron akan menjalankan script/command untuk mentrigger aplikasi lain yang bisa mengolah data.

Setelah mempertimbangkan dari beberapa aspek diatas akhirnya ada satu faktor penentu keputusan, yaitu:
"I am a Programmer, Not a SysAdmin."
Akhirnya saya putuskan untuk menggunakan aplikasi scheduler berbasis java. Karena belum tentu project yang kita develop ini selamanya running pada server berbasis linux/unix yang didalamnya terdapat Cron, dan juga agar scheduler ini bisa di maintain oleh programmer yang tidak perlu mengerti mengenai Cron pada OS sebuah server.

Springboot Task Execution and Scheduling

Kebetulan framework java yang sedang saya gunakan adalah Springboot, jadi saya menggunakan Springboot Scheduling Task sebagai base aplikasi. Source Code bisa dilihat pada Github Springboot berikut https://github.com/spring-guides/gs-scheduling-tasks/tree/master/complete

Berikut potongan code yang digunakan dalam project:
 
@Component
public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}
 
Pada annotation @Scheduled terdapat parameter fixedRate dengan value 5000, ini berarti method ini akan dieksekusi setiap 5000 milisecond (5 detik). Ini merupakan type Simple Trigger karena hanya menggunakan value milisecond sebagai schedule nya.
 
Dan berikut contoh penggunaan Cron Trigger sebagai schedule:
 
@Component
public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron="0 */1 * * * ?")
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}

 
Pada annotation @Scheduled terdapat parameter cron dengan value "0 */1 * * * ?"

Untuk menghindari hardcode didalam aplikasi, maka bisa digunakan file properties.
Berikut contoh penggunaan schedule dari file properties:
 
@Component
public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron="${cron.scheduledtime}")
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}

 

Value pada parameter cron adalah ${cron.scheduledtime}. Value tersebut akan membaca isi dari file properties seperti berikut:
 
cron.scheduledtime = 0 */1 * * * ?
 


Untuk dokumentasi lebih lengkap bisa dilihat pada link ini : Task Execution and Scheduling












No comments:

Post a Comment