Я пишу Laravel json API на MySQL. Представьте, что пользователь создает запись в моей базе данных. Я хочу выполнить какую-то операцию через 24 часа после создания этой записи. Я могу добиться этого, используя: AfterInsertJob::dispatch()->delay(now()->addHours(24));. Но мне нужно выполнять эту операцию снова и снова, пока запись не будет создана. Итак, как я могу это сделать? Должен ли я отправлять работу внутри работы? Я имею в виду Должен ли я отправить AfterInsertJob внутрь AfterInsertJob? Я мог бы использовать Schedule, но тогда как остановить это расписание из AfterInsertJob?






Зачем использовать работу для задачи. Просто запустите запланированную команду, которая проверит все ваши требования.
Добавьте флаг к записи, которую создает пользователь. Установите этот флаг в команде, которую вы пишете, и выполните требуемую задачу. Если пользователь делает все, что ему нужно, установите флаг, и ваша команда проигнорирует эту запись. Если нет, то это будет сделано до тех пор, пока он не будет установлен.
Если это требуется ровно через 24 часа после создания, вы можете проверить дату создания (и кратную ей) и флаг. Но есть и другие суровые способы.
Обновлять:
После прочтения вашего комментария у меня появилась еще одна идея, которая может лучше удовлетворить ваши потребности. Вы можете использовать две вещи.
задерживать это метод, называемый почему диспетчеризация
максимальное количество попыток является собственностью класса работы под названием «попытки»
Ваша работа проверит все, что она должна проверить, и если требования НЕ будут выполнены пользователем, вы позволите работе завершиться ошибкой. Если это так, то он будет возвращен в очередь с задержкой в 24 часа. Это будет повторяться до тех пор, пока не будет достигнуто количество «максимальных попыток».
вы можете в AfterInsertJob->handle при выполнении создать новую очередь:
$need_to_work = true;
.....
if ( $need_to_work ){
AfterInsertJob::dispatch()->delay(3);
}