DevGang
Авторизоваться

Создание автоматического расписания (планировщик заданий 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)

Пример:

  1. Автоматическое электронное письмо с новогодним поздравлением в 12 часов.
    0 0 1 1 * /home/user/automail-new-year.sh
  2. Автоматическое выставление счетов по электронной почте каждый месяц 10-ого числа в 7 утра
    0 07 10 * * /home/user/automail-billing.sh
  3. Уведомление о повестке дня каждый будний день (с понедельника по пятницу) в 9:00.
    0 09 * * 1-5 /home/user/notification-daily-agenda.sh
  4. Уведомление о новом заказе каждые 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 успешно создано.

Полезные ссылки

Вот несколько ссылок, которые можно использовать в качестве справочника.

  1. Полную документацию пакета robfig/cron можно увидеть по этой ссылке.
  2. Используйте crontab.guru для настройки crontab и убедитесь, что время планирования подходит именно вам.
#Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

В подарок 100$ на счет при регистрации

Получить