
# Καθυστερήσεις με διατήρηση κατάστασης

Οι ροές εργασίας μπορούν να τίθενται σε παύση για καθορισμένη διάρκεια μεταξύ βημάτων με τη μέθοδο δημιουργίας `delay()`. Τα βήματα καθυστέρησης διατηρούνται: η καθυστέρηση αποθηκεύεται στη βάση δεδομένων, επομένως επιβιώνει από επανεκκινήσεις εργατών, αναπτύξεις και επανεκκινήσεις διακομιστών.

## Η μέθοδος `->delay()`

Προσθέστε ένα βήμα καθυστέρησης οπουδήποτε στην αλυσίδα της ροής εργασίας:

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

Η ροή εργασίας θα:

1. Εκτελέσει το `SendWelcomeEmailHandler`
2. Περιμένει 1 ημέρα
3. Εκτελέσει το `SendFollowUpEmailHandler`
4. Περιμένει 3 ημέρες
5. Εκτελέσει το `SendFinalEmailHandler`

## Παράμετροι διάρκειας

Η μέθοδος `delay()` δέχεται οποιονδήποτε συνδυασμό ονομασμένων παραμέτρων διάρκειας:

| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
| `$seconds` | `int` | Δευτερόλεπτα αναμονής |
| `$minutes` | `int` | Λεπτά αναμονής |
| `$hours` | `int` | Ώρες αναμονής |
| `$days` | `int` | Ημέρες αναμονής |

Όλες οι τιμές αθροίζονται. Τα παρακάτω είναι ισοδύναμα:

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

Μπορείτε να τις συνδυάσετε:

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

## Πώς λειτουργούν τα βήματα καθυστέρησης

Όταν μια ροή εργασίας φτάσει σε βήμα καθυστέρησης, το Queuety αποστέλλει μια εσωτερική εργασία `__queuety_delay`, ορίζοντας τη στήλη `available_at` στην τρέχουσα ώρα συν τη διάρκεια καθυστέρησης. Η εργασία παραμένει στη βάση δεδομένων και κανένας εργάτης δεν την αναλαμβάνει μέχρι να παρέλθει η καθυστέρηση.

Αυτό σημαίνει ότι:

- **Χωρίς polling.** Οι εργάτες δεν ελέγχουν επανειλημμένα την καθυστέρηση. Η εργασία απλώς γίνεται διαθέσιμη όταν έρθει η ώρα.
- **Χωρίς χρήση μνήμης.** Δεν εκτελείται τίποτα κατά την αναμονή. Η καθυστέρηση υπάρχει μόνο ως γραμμή στη βάση δεδομένων.
- **Επιβιώνει από επανεκκινήσεις.** Αν ο εργάτης επανεκκινηθεί, η εργασία καθυστέρησης παραμένει στην ουρά με τη σωστή χρονική σήμανση `available_at`.

Όταν η εργασία καθυστέρησης αναληφθεί μετά την παρέλευση της καθυστέρησης, η ροή εργασίας προχωρά αυτόματα στο επόμενο βήμα.

## Παράδειγμα: καθυστερημένες ειδοποιήσεις

Στείλτε μια υπενθύμιση 1 ώρα μετά την εγγραφή ενός χρήστη, αλλά μόνο αν δεν έχει ολοκληρώσει την εισαγωγική διαδικασία:

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

Το βήμα `CheckOnboardingHandler` μπορεί να εξετάσει την κατάσταση και να χρησιμοποιήσει [υπό όρους διακλάδωση](https://queuety.inline0.dev/el/docs/workflows/conditional) για να παραλείψει την υπενθύμιση αν η εισαγωγική διαδικασία έχει ήδη ολοκληρωθεί.

## Παράδειγμα: επανάληψη με σταδιακή αναμονή

Εισαγάγετε σκόπιμες καθυστερήσεις ανάμεσα σε βήματα επανάληψης:

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

## Πολλαπλές καθυστερήσεις

Μια ροή εργασίας μπορεί να περιλαμβάνει οποιονδήποτε αριθμό βημάτων καθυστέρησης. Κάθε καθυστέρηση είναι ανεξάρτητη και παρακολουθείται με διαδοχικό όνομα (`delay_0`, `delay_1` κ.λπ.) στην κατάσταση της ροής εργασίας.

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