本文需要介紹 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(), ¶ms)
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 協議》,轉載必須註明作者和本文連結