タスクの保持

デフォルトでは、タスクが 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("タスクの処理に失敗しました: %v", err)
    }
    if _, err := task.ResultWriter().Write(res); err != nil {
        return fmt.Errorf("タスクの結果の書き込みに失敗しました: %v", err)
    }
    return nil
}

上記のように Retention オプションを使用すると、CLI および Web UI を介して結果データを表示できるようになります。さらに、Inspector.GetTaskInfo および Inspector.ListCompletedTasks を使用して、結果データにプログラム的にアクセスすることができます。