Создание автоматического расписания (планировщик заданий Cron) с помощью Golang
Иногда в приложении есть задачи, которые необходимо выполнять автоматически по заранее определенному расписанию. Например, когда мы получаем автоматические электронные письма, содержащие новогоднее поздравление, уведомления о повестке дня каждый будний день в 8:00, выставление счетов каждый месяц 10-го числа в 9:00, проверку новых заказов каждые 10 минут и т.д. В этой статье будет рассказано, как создать автоматическое расписание с помощью golang.
Как выполняется автоматическое планирование на сервере?
В этой статье автоматическое планирование будет выполнено на сервере на базе Linux с помощью cron. Cron - это команда Linux для запуска скриптов по расписанию.
Ниже описано, как настроить расписание для 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)
Пример:
- Автоматическое электронное письмо с новогодним поздравлением в 12 часов.
0 0 1 1 * /home/user/automail-new-year.sh
- Автоматическое выставление счетов по электронной почте каждый месяц 10-ого числа в 7 утра
0 07 10 * * /home/user/automail-billing.sh
- Уведомление о повестке дня каждый будний день (с понедельника по пятницу) в 9:00.
0 09 * * 1-5 /home/user/notification-daily-agenda.sh
- Уведомление о новом заказе каждые 10 минут
*/10 * * * * /home/user/notification-new-order.sh
Да, cron я понимаю. Как это реализовано в Go?
После поиска нескольких пакетов go, касающихся планировщика, я выбрал пакет robfig/cron
v3. Метод реализации довольно прост. Посмотрим вместе.
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")
}
После этого запускаем функцию Main.
go run main.go
Затем наблюдайте за результатами.
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.
Автоматическое планирование с golang успешно создано.
Полезные ссылки
Вот несколько ссылок, которые можно использовать в качестве справочника.
- Полную документацию пакета robfig/cron можно увидеть по этой ссылке.
- Используйте crontab.guru для настройки crontab и убедитесь, что время планирования подходит именно вам.