Планирование работы в GO .
Существует множество вариантов задач, требующих периодического запуска задания, которое может выполняться в фоновом режиме и выполнять свою логику.
Мы используем реализацию go-quartz https://github.com/reugn/go-quartz, написанную reugn, которая является библиотекой с открытым исходным кодом для планирования заданий.
Почему этот пакет:
Это минималистская библиотека, что означает, что она не импортирует никакие библиотеки для своего исполнения, кроме внутренних пакетов Golang.
Он также предоставляет множество триггеров, включая простой таймер, таймер Cron и RunOnce.
Shell Job
Для запуска задания в нам сначала нужно инициализировать стандартный планировщик пакета go-quartz, а затем запустить его с помощью sched.Start() .
Нам нужно передать планировщику выражение cron и команду, которая должна быть выполнена как часть нашей логики.
sched := quartz.NewStdScheduler()
sched.Start() // start scheduler
// creating a trigger with provided cron expression which also checks if the expression is correct or not.
cronTrigger, err := quartz.NewCronTrigger("1/3 * * * * *")
if err != nil {
fmt.Println(err)
return
}
shellJob := quartz.NewShellJob("ls -la")
sched.ScheduleJob(shellJob, cronTrigger)
time.Sleep(time.Second * 10) // not needed if the server is running.
fmt.Println(sched.GetJobKeys()) // prints keys associated with job.
fmt.Println(shellJob.Result) // prints result of the shell job.
sched.Stop()
Curl Job
Результаты перевода
Это встроенная функциональность, предоставляемая пакетом на случай, если требуется периодически опрашивать какой-либо REST API.
sched := quartz.NewStdScheduler()
sched.Start()
//
curlJob, err := quartz.NewCurlJob(http.MethodGet, "https://jsonplaceholder.typicode.com/users/1", "", nil)
if err != nil {
fmt.Println(err)
return
}
sched.ScheduleJob(curlJob, quartz.NewSimpleTrigger(time.Second*7))
time.Sleep(time.Second * 10) // not needed if the server is running.
fmt.Println(sched.GetJobKeys()) // prints keys associated with job.
fmt.Println(curlJob.Response) // prints response receive from API.
sched.Stop()
Если вы видите quartz.NewSimpleTrigger(time.Second*7), функциональность, в которой можно указать время в секундах, минутах, часах и т. д. для периодического запуска задания.
Custom Job
Custom Job — это когда у нас есть некоторая пользовательская логика, которая должна выполняться периодически. В файле schedular.go мы создали планировщик и передали ему cron, что позволит ему выполнить задание через 3 секунды.
scheduler.go
sched := quartz.NewStdScheduler()
sched.Start()
cronTrigger, err := quartz.NewCronTrigger("1/3 * * * * *")
if err != nil {
fmt.Println(err)
return
}
cronJob := CronJob{"Cron job"}
sched.ScheduleJob(&cronJob, cronTrigger)
fmt.Println(scheduledJob.TriggerDescription)
sched.Stop()
Здесь мы передали объект CronTab в schedule.ScheduleJob(), который выполняет предоставленную структуру и логику из метода Execute(), написанном в cronJob.go.
cronJob.go
// CronJob struct implements quartz package's Job interface{}
type Cronjob struct {
desc string
}
func (c *CronJob) Key() int {
return quartz.HashCode(c.instanceID)
}
func (c *CronJob) Description() string{
return c.desc
}
func (c *CronJob) Execute(){
// Your custom logic
}
CronJob реализует интерфейс Job, который уже присутствует в библиотеке quartz’s. В scheduleJob() есть внутренняя логика для вызова метода Execute() , который запускает написанную пользовательскую логику.
Заключение
Поскольку пакет quartz’s не использует зависимостей, шансы на уязвимость безопасности меньше, а также quartz’s очень легковесный.
В зависимости от задачи вы можете выбрать тип работы, который соответствует вашим нуждам. Удачного планирования…!