一架梯子,一头程序猿,仰望星空!
Asynq任务队列教程 > 内容正文

任务留存&任务结果


任务保留

默认情况下,一旦任务成功通过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.GetTaskInfoInspector.ListCompletedTasks以编程方式访问结果数据。