Сохранение задачи
По умолчанию, после успешной обработки Handler
(т.е. после возврата nil
из Handler.ProcessTask
), задача будет удалена из очереди. Однако, если вам нужно сохранить задачу в очереди после выполнения (например, для проверки), вы можете указать период ее сохранения.
Ниже приведен пример использования опции Retention
для указания, что задачу следует сохранить в очереди на 24 часа после выполнения.
// Установите опцию при инициализации задачи.
task := asynq.NewTask("my_task", payload, asynq.Retention(24 * time.Hour))
// В альтернативе, установите опцию при постановке задачи в очередь.
info, err := client.Enqueue(task, asynq.Retention(24 * time.Hour))
После установки этой опции вы сможете просматривать завершенные задачи с помощью CLI или веб-интерфейса.
Результат задачи
Если вам нужно сохранить некоторые данные, связанные с задачей во время ее обработки, и эти данные нужны только во время жизненного цикла задачи (т.е. до удаления задачи из очереди), вы можете сохранить данные вместе с задачей.
Используйте 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 и веб-интерфейс. Кроме того, вы можете получать доступ к данным результата программно с помощью Inspector.GetTaskInfo
и Inspector.ListCompletedTasks
.