任务保留
默认情况下,一旦任务成功通过Handler
处理(即Handler.ProcessTask
返回nil),该任务将从队列中删除。然而,如果你希望在任务完成后将其保留在队列中(例如,用于检查目的),你可以为任务指定保留期。
下面是一个使用Retention
选项指定任务在完成后保留在队列中24小时的示例。
// 在任务初始化时设置选项。
task := asynq.NewTask("my_task", payload, asynq.Retention(24 * time.Hour))
// 或者,在排队时设置选项。
info, err := client.Enqueue(task, asynq.Retention(24 * time.Hour))
设置了此选项后,你应该能够使用CLI或Web UI看到已完成的任务。
任务结果
如果你想在任务处理时存储与任务相关的一些数据,并且如果这些数据只在任务的生命周期内需要(即直到任务从队列中删除),那么你可以将数据与任务一起存储。
使用ResultWriter
将数据写入redis,从而将写入的数据与任务关联起来。
注意:请谨慎考虑写入redis的数据量,如果需要存储的数据很大,最好使用基于磁盘的存储系统,比如SQL数据库。
// 在处理程序代码中。
func MyHandler(ctx context.Context, task *asynq.Task) error {
res, err := DoStuff(ctx, task)
if err != nil {
return fmt.Errorf("failed to process task: %v", err)
}
if _, err = task.ResultWriter().Write(res); err != nil {
return fmt.Errorf("failed to write task result: %v", err)
}
return nil
}
如果你结合上面显示的Retention
选项一起使用,你将能够通过CLI和Web UI查看结果数据。此外,可以通过使用Inspector.GetTaskInfo
和Inspector.ListCompletedTasks
以编程方式访问结果数据。