2025-12-09 14:31:02 +08:00
|
|
|
|
// Package taskq 提供基于 Redis 的异步任务队列功能
|
|
|
|
|
|
// 使用 asynq 库作为底层实现,支持任务注册、发布、消费和重试机制
|
2025-12-10 00:53:30 +08:00
|
|
|
|
//
|
|
|
|
|
|
// 本包提供两种使用方式:
|
|
|
|
|
|
// 1. 包级别函数:使用全局默认 Servlet,适合单实例场景
|
|
|
|
|
|
// 2. Servlet 实例方法:支持多实例复用,适合需要隔离的场景
|
2025-12-09 14:31:02 +08:00
|
|
|
|
package taskq
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"reflect"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-12-10 00:53:30 +08:00
|
|
|
|
// 全局默认 Servlet 实例
|
|
|
|
|
|
var defaultServlet = NewServlet()
|
|
|
|
|
|
|
2025-12-09 14:31:02 +08:00
|
|
|
|
var (
|
|
|
|
|
|
errorType = reflect.TypeOf((*error)(nil)).Elem() // error 类型反射
|
|
|
|
|
|
contextType = reflect.TypeOf((*context.Context)(nil)).Elem() // context.Context 类型反射
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-12-10 00:53:30 +08:00
|
|
|
|
// Default 返回默认的 Servlet 实例
|
|
|
|
|
|
func Default() *Servlet {
|
|
|
|
|
|
return defaultServlet
|
2025-12-09 14:31:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-10 12:02:59 +08:00
|
|
|
|
// SetDefault 设置默认的 Servlet 实例
|
|
|
|
|
|
// 这是一个并发不安全的操作,建议在程序初始化阶段调用
|
|
|
|
|
|
func SetDefault(servlet *Servlet) {
|
|
|
|
|
|
defaultServlet = servlet
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-10 00:53:30 +08:00
|
|
|
|
// Configure 配置默认 Servlet
|
|
|
|
|
|
// 必须在 Init 之前调用
|
|
|
|
|
|
func Configure(cfg Config) error {
|
|
|
|
|
|
return defaultServlet.Configure(cfg)
|
2025-12-09 14:31:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-10 00:53:30 +08:00
|
|
|
|
// Init 初始化默认 Servlet 和所有插件
|
|
|
|
|
|
// 必须在 Start 之前调用,且只能调用一次
|
|
|
|
|
|
func Init(ctx context.Context) error {
|
|
|
|
|
|
return defaultServlet.Init(ctx)
|
2025-12-09 19:58:18 +08:00
|
|
|
|
}
|
2025-12-09 14:31:02 +08:00
|
|
|
|
|
2025-12-10 00:53:30 +08:00
|
|
|
|
// Start 启动 taskq 服务器(包级别函数,使用默认 Servlet)
|
|
|
|
|
|
// 开始监听任务队列并处理任务
|
|
|
|
|
|
// 必须在 Init 之后调用
|
|
|
|
|
|
func Start(ctx context.Context) error {
|
|
|
|
|
|
return defaultServlet.Start(ctx)
|
2025-12-09 14:31:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-10 00:53:30 +08:00
|
|
|
|
// Stop 优雅停止 taskq 服务器(包级别函数,使用默认 Servlet)
|
2025-12-09 14:31:02 +08:00
|
|
|
|
// 发送停止信号并等待服务器完全关闭
|
|
|
|
|
|
func Stop() {
|
2025-12-10 00:53:30 +08:00
|
|
|
|
defaultServlet.Stop()
|
2025-12-09 14:31:02 +08:00
|
|
|
|
}
|