chore: 添加任务队列管理系统
This commit is contained in:
137
example/main.go
Normal file
137
example/main.go
Normal file
@@ -0,0 +1,137 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"code.tczkiot.com/wlw/taskq"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
// 定义任务数据结构
|
||||
type EmailTask struct {
|
||||
UserID int `json:"user_id"`
|
||||
TemplateID string `json:"template_id"`
|
||||
}
|
||||
|
||||
type ImageResizeTask struct {
|
||||
SourceURL string `json:"source_url"`
|
||||
}
|
||||
|
||||
// 定义任务处理器
|
||||
func handleEmailTask(ctx context.Context, t EmailTask) error {
|
||||
log.Printf("处理邮件任务: 用户ID=%d, 模板ID=%s", t.UserID, t.TemplateID)
|
||||
// 模拟邮件发送逻辑
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleImageResizeTask(ctx context.Context, t ImageResizeTask) error {
|
||||
log.Printf("处理图片调整任务: 源URL=%s", t.SourceURL)
|
||||
// 模拟图片调整逻辑
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
// 创建 Redis 客户端
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: "127.0.0.1:6379",
|
||||
DB: 1,
|
||||
})
|
||||
defer rdb.Close()
|
||||
|
||||
// 初始化 taskq
|
||||
taskq.SetRedis(rdb)
|
||||
taskq.Init()
|
||||
|
||||
// 创建邮件任务
|
||||
emailTask := &taskq.Task[EmailTask]{
|
||||
Queue: "email",
|
||||
Name: "email:deliver",
|
||||
MaxRetries: 3,
|
||||
Priority: 5,
|
||||
TTR: 0,
|
||||
Handler: handleEmailTask,
|
||||
}
|
||||
|
||||
// 创建图片调整任务
|
||||
imageTask := &taskq.Task[ImageResizeTask]{
|
||||
Queue: "image",
|
||||
Name: "image:resize",
|
||||
MaxRetries: 3,
|
||||
Priority: 3,
|
||||
TTR: 0,
|
||||
Handler: handleImageResizeTask,
|
||||
}
|
||||
|
||||
// 注册任务
|
||||
if err := taskq.Register(emailTask); err != nil {
|
||||
log.Fatal("注册邮件任务失败:", err)
|
||||
}
|
||||
if err := taskq.Register(imageTask); err != nil {
|
||||
log.Fatal("注册图片任务失败:", err)
|
||||
}
|
||||
|
||||
// 创建监控处理器
|
||||
handler, err := taskq.NewInspectHandler(taskq.InspectOptions{
|
||||
RootPath: "/monitor",
|
||||
ReadOnly: false,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal("创建监控处理器失败:", err)
|
||||
}
|
||||
|
||||
// 启动 taskq 服务器
|
||||
ctx := context.Background()
|
||||
go func() {
|
||||
err := taskq.Start(ctx)
|
||||
if err != nil {
|
||||
log.Fatal("启动 taskq 服务器失败:", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// 定时发布任务
|
||||
go func() {
|
||||
ticker := time.NewTicker(5 * time.Second) // 每5秒发布一次任务
|
||||
defer ticker.Stop()
|
||||
|
||||
taskCounter := 0
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-ticker.C:
|
||||
taskCounter++
|
||||
|
||||
// 发布邮件任务
|
||||
err := emailTask.Publish(ctx, EmailTask{
|
||||
UserID: taskCounter,
|
||||
TemplateID: "welcome",
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("发布邮件任务失败: %v", err)
|
||||
} else {
|
||||
log.Printf("发布邮件任务成功: 用户ID=%d", taskCounter)
|
||||
}
|
||||
|
||||
// 发布图片调整任务
|
||||
err = imageTask.Publish(ctx, ImageResizeTask{
|
||||
SourceURL: fmt.Sprintf("https://example.com/image%d.jpg", taskCounter),
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("发布图片任务失败: %v", err)
|
||||
} else {
|
||||
log.Printf("发布图片任务成功: 任务ID=%d", taskCounter)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// 启动 HTTP 服务器提供监控界面
|
||||
log.Printf("启动监控服务器在 http://localhost:8080")
|
||||
log.Fatal(http.ListenAndServe(":8080", handler))
|
||||
}
|
||||
Reference in New Issue
Block a user