タスクの保持
デフォルトでは、タスクが 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
を使用して、結果データにプログラム的にアクセスすることができます。