任务 Task
业务任务注册与直接/队列分发
task 用于注册命名业务任务。默认直接在当前进程执行;安装 queue 后可以把任务分发到队列 worker 执行。
安装
go get github.com/duxweb/runa/task
接入应用
package main
import (
"context"
"fmt"
"github.com/duxweb/runa"
"github.com/duxweb/runa/provider"
"github.com/duxweb/runa/task"
)
type SendMail struct {
To string `json:"to"`
}
type appModule struct {
provider.ModuleBase
}
func (appModule) Name() string { return "app" }
func (appModule) Register(ctx context.Context, app provider.Context) error {
tasks, err := provider.Invoke[*task.Registry](app)
if err != nil {
return err
}
tasks.Register("mail.send", func(ctx context.Context, item *task.TaskOf[SendMail]) error {
fmt.Println("send", item.Payload.To)
return nil
})
return nil
}
func main() {
app := runa.New()
app.Install(task.Provider())
app.Module(appModule{})
if err := app.Freeze(context.Background()); err != nil {
panic(err)
}
_, _ = task.Default().Dispatch(context.Background(), "mail.send", SendMail{To: "hello@runa.dev"})
}
独立 New 使用
registry := task.New()
registry.Register("mail.send", handler)
_, err := registry.Dispatch(context.Background(), "mail.send", SendMail{To: "hello@runa.dev"})
_ = err
配置
task 当前没有 TOML 配置。任务名、载荷类型、重试、超时、队列等通过注册或分发选项声明。
分发选项
_, err := tasks.Dispatch(ctx, "mail.send", payload,
task.Queue("default"),
task.Delay(time.Minute),
task.Unique("mail:1"),
)
Direct()强制直接执行Queue(name)指定队列Delay(duration)延迟执行Unique(key)去重
命令
安装 task.Provider() 后会注册:
go run . task:list
go run . task:run mail.send '{"to":"hello@runa.dev"}'
常见错误
任务名和载荷类型不稳定
任务可能被队列序列化后异步执行。任务名和 payload 结构应保持稳定,避免 worker 反序列化失败。
以为 task 一定异步
默认 task 是直接执行。需要异步执行时,要安装 queue 并使用 task.Queue("default")。
API 速查
task.New()创建独立注册表task.Provider()接入框架生命周期task.Default()从默认 DI 取*task.Registryregistry.Register(name, handler, options...)注册任务registry.Dispatch(ctx, name, payload, options...)分发任务task.MarshalPayload(payload)序列化任务载荷