Планирование работы в 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

130 / 5 000

Результаты перевода

Это встроенная функциональность, предоставляемая пакетом на случай, если требуется периодически опрашивать какой-либо 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 очень легковесный.
В зависимости от задачи вы можете выбрать тип работы, который соответствует вашим нуждам. Удачного планирования…!

Ответить