快速开始api开发(五)定时任务 crontab 和 队列 queue

Python
435
0
0
2022-11-12
标签   go-zero

本文需要介绍 gotools 工具

需要使用的工具命令:gotools queue -h
需要使用的工具命令:gotools crontab -h
代码地址:github.com/wuyan94zl/gotools

队列

生成

执行:gotools queue --name register

目录

queue
    |-- register
        |-- register.go
    |-- queue.go

编写逻辑

修改:queue/register/register.go

package register

import (
    "context" 
    "encoding/json" 
    "fmt" 
    "github.com/hibiken/asynq" 
    "github.com/wuyan94zl/example-api/container" 
    "github.com/wuyan94zl/example-api/models/user" 
    "github.com/wuyan94zl/gotools/utils"
)

func Handle(ctx context.Context, t *asynq.Task) error {
    params := Params{}
    err := json.Unmarshal(t.Payload(), &params)
    if err != nil {
        return err
    }
    Do(ctx, params)
    return nil
}

const QueueKey = "key" // todo 自定义队列key

type Params struct {
    // todo 自定义队列参数结构体
    Nickname string `json:"nickname"`
    LoginID  string `json:"login_id"`
    Password string `json:"password"`
}

func Do(ctx context.Context, params Params) {
    // todo 队列业务逻辑处理
    u := user.Users{
        Nickname: params.Nickname,
        LoginID:  params.LoginID,
        Password: utils.Md5ByString(params.Password),
    }
    info, err := container.Instance().UserModel.Insert(ctx, &u)
    fmt.Println(info, err)
}
队列逻辑为:添加注册一个用户

定时任务

生成

执行:gotools crontab -n register

目录

crontab
    |-- register
        |-- cronjob.go
    |-- crontab.go

编写逻辑

修改:crontab/register/cronjob.go

package register

import (
    "fmt" 
    "github.com/wuyan94zl/example-api/queue" 
    "github.com/wuyan94zl/example-api/queue/register" 
    "time"
)

const Spec = "0 * * * * *" // todo 设置定时时间 秒 分 时 日 月 周

func NewJob() *Job {
    return &Job{}
}

type Job struct{}

func (j *Job) Run() {
    // todo 定时处理逻辑
    params := register.Params{
        Nickname: fmt.Sprintf("无言%s", time.Now().Format("01021504")),
        LoginID:  fmt.Sprintf("login%s", time.Now().Format("01021504")),
        Password: "123456",
    }
    queue.Add(register.QueueKey, params)
}
逻辑为:每分钟向添加用户队列发送一个消息

启动队列和定时任务 (仅操作一次)

修改:main.go

package main

import (
    "fmt" 
    "github.com/gin-gonic/gin" 
    "github.com/wuyan94zl/example-api/config" 
    "github.com/wuyan94zl/example-api/container" 
    "github.com/wuyan94zl/example-api/crontab" 
    "github.com/wuyan94zl/example-api/queue" 
    "github.com/wuyan94zl/example-api/router" 
    "github.com/wuyan94zl/gotools/utils"
)

func main() {
    c := new(config.Config)
    utils.MustConfig("/config.yaml", c)

    container.NewContainer(c.Container)

    go queue.NewInstance(c.Container.Redis.Host, c.Container.Redis.Pass).Start() // 增加启动队列代码 
    go crontab.NewInstance().Start() // 增加启动定时任务代码

    app := gin.Default()
    group := app.Group("")
    router.RegisterHandlers(group)
    app.Run(fmt.Sprintf("%s:%d", c.Host, c.Port))
}

go-zero 启动

    group := service.NewServiceGroup()
    defer group.Stop()
    group.Add(queue.NewInstance(host, pass)) // 增加启动队列代码 
    group.Add(crontab.NewInstance()) // 增加启动定时任务代码 
    group.Start()

结束

执行:go mod tidy && go run main.go

验证是否每分钟会注册一个用户