Реализация регулярных задач
JobsВ микросервисе Delivery есть 2 Use Case, которые можно запускать время от времени без участия человека:
- Распределение и назначение заказов на курьеров (раз в 1 секунду)
- Перемещение курьеров (раз в 1 секунду)
Используйте любой удобный способ запуска регулярных задач в Go.
Пример
Вы можете использовать библиотеку github.com/robfig/cron/v3 или аналог.
Создаем пакет jobs (у меня он находиться в internal)
package jobs
import (
"context"
"delivery/internal/core/application/usecases/commands"
"delivery/internal/pkg/errs"
"github.com/labstack/gommon/log"
"github.com/robfig/cron/v3"
)
var _ cron.Job = &MoveCouriersJob{}
type MoveCouriersJob struct {
moveCouriersCommandHandler commands.MoveCouriersCommandHandler
}
func NewMoveCouriersJob(
moveCouriersCommandHandler commands.MoveCouriersCommandHandler) (cron.Job, error) {
if moveCouriersCommandHandler == nil {
return nil, errs.NewValueIsRequiredError("moveCouriersCommandHandler")
}
return &MoveCouriersJob{
moveCouriersCommandHandler: moveCouriersCommandHandler}, nil
}
func (j *MoveCouriersJob) Run() {
ctx := context.Background()
command, err := commands.NewMoveCouriersCommand()
if err != nil {
log.Error(err)
}
err = j.moveCouriersCommandHandler.Handle(ctx, command)
if err != nil {
log.Error(err)
}
}
Инициализируем Job в Composition Root
func (cr *CompositionRoot) NewAssignOrdersJob() cron.Job {
job, err := jobs.NewAssignOrdersJob(cr.NewAssignOrdersCommandHandler())
if err != nil {
log.Fatalf("cannot create AssignOrdersJob: %v", err)
}
return job
}
func (cr *CompositionRoot) NewMoveCouriersJob() cron.Job {
job, err := jobs.NewMoveCouriersJob(cr.NewMoveCouriersCommandHandler())
if err != nil {
log.Fatalf("cannot create MoveCouriersJob: %v", err)
}
return job
}
Запускаем в main.go
func startCron(compositionRoot *cmd.CompositionRoot) {
c := cron.New()
_, err := c.AddJob("@every 1s", compositionRoot.NewAssignOrdersJob())
if err != nil {
log.Fatalf("ошибка при добавлении задачи: %v", err)
}
_, err = c.AddJob("@every 1s", compositionRoot.NewMoveCouriersJob())
if err != nil {
log.Fatalf("ошибка при добавлении задачи: %v", err)
}
c.Start()
}
По любым вопросам обращайтесь в комментариях к уроку или в Telegram
Если вы обнаружили ошибку или неточность в данном уроке, сообщите о ней в комментариях к данному уроку. Это поможет сделать курс лучше.