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:
Email otomatis untuk ucapan tahun baru jam 12 malam
0 0 1 1 * /home/user/automail-new-year.sh
Email otomatis tagihan setiap bulan tanggal 10 jam 7 pagi
0 07 10 * * /home/user/automail-billing.sh
Notifikasi agenda setiap hari kerja (Senin-Jumat) jam 9 pagi
0 09 * * 1-5 /home/user/notification-daily-agenda.sh
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
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 dapat dilihat dari link tersebut.
- Gunakan crontab.guru untuk mengatur crontab dan memastikan waktu penjadwalan sudah sesuai dengan kebutuhan.
Top comments (0)