Membuat Penjadwalan Otomatis (Cron Job Scheduler) menggunakan Golang
Tags: go, cron
Published: 2021-09-16 06:02:06

Terkadang dalam sebuah aplikasi, ada tugas-tugas yang perlu dijalankan otomatis sesuai jadwal yang telah ditentukan. Contohnya, ketika kita menerima email otomatis yang berisi ucapan tahun baru, notifikasi agenda setiap hari kerja jam 8 pagi, tagihan setiap bulan tanggal 10 jam 9 pagi, cek pesanan baru setiap 10 menit, dan lainnya. Artikel ini akan membahas bagaimana cara membuat penjadwalan otomatis menggunakan golang.

## Bagaimana penjadwalan otomatis dilakukan pada server?
Pada artikel ini, penjadwalan otomatis akan dilakukan pada server berbasis Linux dengan menggunakan **cron**. Cron adalah sebuah command Linux untuk menjalankan script secara terjadwal. 

Di bawah ini adalah cara mengatur penjadwalan pada crontab.
```
* * * * * perintah yang akan dieksekusi
– – – – –
| | | | |
| | | | +—– day of week (0 – 7) (Sunday=0)
| | | +——- month (1 – 12)
| | +——— day of month (1 – 31)
| +———– hour (0 – 23)
+————- min (0 – 59)
```

Contoh:
1. Email otomatis untuk ucapan tahun baru jam 12 malam
`0 0 1 1 * /home/user/automail-new-year.sh`

2. Email otomatis tagihan setiap bulan tanggal 10 jam 7 pagi
`0 07 10 * * /home/user/automail-billing.sh`

3. Notifikasi agenda setiap hari kerja (Senin-Jumat) jam 9 pagi
`0 09 * * 1-5 /home/user/notification-daily-agenda.sh`

4. Notifikasi pesanan baru setiap 10 menit sekali
`*/10 * * * * /home/user/notification-new-order.sh`

## Ya, saya sudah memahami cron. Bagaimana cara implementasi pada Go?
Setelah melakukan pencarian terhadap beberapa package go terkait scheduler, saya memilih package [`robfig/cron`](https://github.com/robfig/cron) v3. Cara implementasinya cukup sederhana. Mari kita lihat bersama.
```
package main

import (
   "fmt"
   "os"
   "os/signal"
   "syscall"
   "time"

   cron "github.com/robfig/cron/v3"
)

func main() {
   // set scheduler berdasarkan zona waktu sesuai kebutuhan
   jakartaTime, _ := time.LoadLocation("Asia/Jakarta") 
   scheduler := cron.New(cron.WithLocation(jakartaTime))

   // stop scheduler tepat sebelum fungsi berakhir
   defer scheduler.Stop()

   // set task yang akan dijalankan scheduler
   // gunakan crontab string untuk mengatur jadwal
   scheduler.AddFunc("0 0 1 1 *", func() { SendAutomail("New Year") })
   scheduler.AddFunc("0 07 10 * *", SendMonthlyBillingAutomail)
   scheduler.AddFunc("0 09 * * 1-5", NotifyDailyAgenda)
   scheduler.AddFunc("*/10 * * * *", NotifyNewOrder)

   // start scheduler
   go scheduler.Start()

   // trap SIGINT untuk trigger shutdown.
   sig := make(chan os.Signal, 1)
   signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
   <-sig
}

func SendAutomail(automailType string) {
    // ... instruksi untuk mengirim automail berdasarkan automailType
    fmt.Printf(time.Now().Format("2006-01-02 15:04:05") + " SendAutomail " + automailType + " telah dijalankan.\n")
}

func SendMonthlyBillingAutomail(){
    // ... instruksi untuk mengirim automail berisi tagihan
    fmt.Printf(time.Now().Format("2006-01-02 15:04:05") + " SendMonthlyBillingAutomail telah dijalankan.\n")
}

func NotifyDailyAgenda(){
    // ... instruksi untuk mengirim notifikasi agenda harian
    fmt.Printf(time.Now().Format("2006-01-02 15:04:05") + " NotifyDailyAgenda telah dijalankan.\n")
}

func NotifyNewOrder(){
    // ... instruksi untuk mengecek pesanan baru, lalu mengirimkan notifikasi
    fmt.Printf(time.Now().Format("2006-01-02 15:04:05") + " NotifyNewOrder telah dijalankan.\n")
}

```

Setelah itu, kita jalankan function Main.
```
go run main.go
```

Lalu, amati hasilnya.
```
2021-09-16 09:00:00 NotifyDailyAgenda telah dijalankan.
2021-09-16 12:30:00 NotifyNewOrder telah dijalankan.
2021-09-16 12:40:00 NotifyNewOrder telah dijalankan.
```

Penjadwalan otomatis dengan golang sudah berhasil dibuat.

## Selanjutnya

Berikut beberapa link yang dapat dijadikan referensi.
* Dokumentasi lengkap package [robfig/cron](https://github.com/robfig/cron) dapat dilihat dari link tersebut.
* Gunakan [crontab.guru](https://crontab.guru/) untuk mengatur crontab dan memastikan waktu penjadwalan sudah sesuai dengan kebutuhan.