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)) }