Трайни забавяния
Работните потоци могат да бъдат спирани за фиксиран период между стъпките чрез метода на конструктора delay(). Стъпките за забавяне са трайни: забавянето се съхранява в базата данни и се запазва при рестартиране на работници, внедрявания и рестартиране на сървъра.
Методът ->delay()
Добавете стъпка за забавяне навсякъде във веригата на работния поток:
use Queuety\Queuety;
Queuety::workflow( 'drip_campaign' )
->then( SendWelcomeEmailHandler::class )
->delay( days: 1 )
->then( SendFollowUpEmailHandler::class )
->delay( days: 3 )
->then( SendFinalEmailHandler::class )
->dispatch( [ 'user_id' => 42 ] );
Работният поток ще:
- Изпълни
SendWelcomeEmailHandler - Изчака 1 ден
- Изпълни
SendFollowUpEmailHandler - Изчака 3 дни
- Изпълни
SendFinalEmailHandler
Параметри за продължителност
Методът delay() приема произволна комбинация от именувани параметри за продължителност:
| Параметър | Тип | Описание |
|---|---|---|
$seconds |
int |
Секунди за изчакване |
$minutes |
int |
Минути за изчакване |
$hours |
int |
Часове за изчакване |
$days |
int |
Дни за изчакване |
Всички стойности се сумират. Следните варианти са равностойни:
->delay( seconds: 3600 )
->delay( minutes: 60 )
->delay( hours: 1 )
Можете да ги комбинирате:
->delay( hours: 1, minutes: 30 ) // 90 minutes total
Как работят стъпките за забавяне
Когато работен поток достигне стъпка за забавяне, Queuety изпраща вътрешна задача __queuety_delay с колона available_at, зададена на текущото време плюс продължителността на забавянето. Задачата остава в базата данни и никой работник не я поема, докато забавянето не изтече.
Това означава:
- Без периодични проверки. Работниците не проверяват многократно забавянето. Задачата просто става достъпна, когато настъпи зададеното време.
- Без използване на памет. По време на изчакването нищо не се изпълнява. Забавянето съществува само като ред в базата данни.
- Запазва се при рестартиране. Ако работникът се рестартира, задачата за забавяне остава в опашката с правилния времеви маркер
available_at.
Когато задачата за забавяне бъде поета след изтичането му, работният поток автоматично продължава със следващата стъпка.
Пример: отложени известия
Изпратете напомняне 1 час след регистрацията на потребител, но само ако той не е завършил въвеждането:
Queuety::workflow( 'onboarding_reminder' )
->then( CreateAccountHandler::class )
->delay( hours: 1 )
->then( CheckOnboardingHandler::class )
->then( SendReminderHandler::class )
->dispatch( [ 'email' => 'user@example.com' ] );
Стъпката CheckOnboardingHandler може да провери състоянието и да използва условно разклоняване, за да пропусне напомнянето, ако въвеждането вече е завършено.
Пример: повторен опит със забавяне
Добавете умишлени забавяния между стъпки с повторен опит:
Queuety::workflow( 'poll_external_api' )
->then( CheckStatusHandler::class, 'check' )
->delay( minutes: 5 )
->then( CheckStatusHandler::class, 'recheck' )
->delay( minutes: 15 )
->then( CheckStatusHandler::class, 'final_check' )
->then( ProcessResultHandler::class )
->dispatch( [ 'external_id' => 'abc-123' ] );
Няколко забавяния
Работният поток може да съдържа произволен брой стъпки за забавяне. Всяко забавяне е независимо и се проследява чрез последователно име (delay_0, delay_1 и т.н.) в състоянието на работния поток.
Queuety::workflow( 'multi_step_drip' )
->then( StepA::class )
->delay( hours: 2 )
->then( StepB::class )
->delay( days: 1 )
->then( StepC::class )
->delay( minutes: 30 )
->then( StepD::class )
->dispatch( $payload );