Сохранение задачи

По умолчанию, после успешной обработки 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.