
# Tartós késleltetések

A munkafolyamatok lépések között rögzített időre szüneteltethetők a `delay()` építőmetódussal. A késleltetési lépések tartósak: a késleltetés az adatbázisban tárolódik, így a feldolgozók újraindítását, az élesítéseket és a szerverek újraindítását is túléli.

## A `->delay()` metódus

Adjon késleltetési lépést a munkafolyamatlánc bármely pontjához:

```php
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 ] );
```

A munkafolyamat a következőket teszi:

1. Lefuttatja a `SendWelcomeEmailHandler` metódust
2. Vár 1 napot
3. Lefuttatja a `SendFollowUpEmailHandler` metódust
4. Vár 3 napot
5. Lefuttatja a `SendFinalEmailHandler` metódust

## Időtartam-paraméterek

A `delay()` metódus tetszőleges kombinációban fogad elnevezett időtartam-paramétereket:

| Paraméter | Típus | Leírás |
|---|---|---|
| `$seconds` | `int` | Várakozás másodpercben |
| `$minutes` | `int` | Várakozás percben |
| `$hours` | `int` | Várakozás órában |
| `$days` | `int` | Várakozás napokban |

Az értékek összeadódnak. A következők egyenértékűek:

```php
->delay( seconds: 3600 )
->delay( minutes: 60 )
->delay( hours: 1 )
```

Ezeket kombinálhatja is:

```php
->delay( hours: 1, minutes: 30 ) // 90 minutes total
```

## A késleltetési lépések működése

Amikor a munkafolyamat késleltetési lépéshez ér, a Queuety egy belső `__queuety_delay` feladatot indít a `available_at` oszlopban az aktuális idő és a késleltetés időtartamának összegével. A feladat az adatbázisban marad, és egyetlen feldolgozó sem veszi fel a késleltetés leteltéig.

Ez azt jelenti, hogy:

- **Nincs lekérdezéses ellenőrzés.** A feldolgozók nem ellenőrzik ismételten a késleltetést. A feladat egyszerűen elérhetővé válik, amikor eljön az ideje.
- **Nincs memóriahasználat.** A várakozás alatt semmi sem fut. A késleltetés csak egy adatbázissor formájában létezik.
- **Újraindítások után is megmarad.** Ha a feldolgozó újraindul, a késleltetési feladat továbbra is a sorban van a megfelelő `available_at` időbélyeggel.

Amint a késleltetési feladatot a késleltetés letelte után felveszik, a munkafolyamat automatikusan a következő lépésre lép.

## Példa: késleltetett értesítések

Küldjön emlékeztetőt 1 órával a felhasználó regisztrációja után, de csak akkor, ha még nem fejezte be a kezdeti beállítást:

```php
Queuety::workflow( 'onboarding_reminder' )
    ->then( CreateAccountHandler::class )
    ->delay( hours: 1 )
    ->then( CheckOnboardingHandler::class )
    ->then( SendReminderHandler::class )
    ->dispatch( [ 'email' => 'user@example.com' ] );
```

A `CheckOnboardingHandler` lépés megvizsgálhatja az állapotot, és a [feltételes elágazás](https://queuety.inline0.dev/hu/docs/workflows/conditional) segítségével átugorhatja az emlékeztetőt, ha a kezdeti beállítás már befejeződött.

## Példa: újrapróbálkozás várakozással

Szúrjon be szándékos késleltetéseket az újrapróbálkozásszerű lépések közé:

```php
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' ] );
```

## Több késleltetés

A munkafolyamat tetszőleges számú késleltetési lépést tartalmazhat. Minden késleltetés független, és a munkafolyamat állapotában szekvenciális névvel követhető (`delay_0`, `delay_1` stb.).

```php
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 );
```
