快速開始api開發(五)定時任務 crontab 和 佇列 queue

wuyan94zl發表於2022-08-19

本文需要介紹 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
驗證是否每分鐘會註冊一個使用者

下節 物件儲存/日誌

本作品採用《CC 協議》,轉載必須註明作者和本文連結
沒有造飛機的格局,怎麼能擰得好螺絲。

相關文章