
# İş Akışı Son Tarihleri

İş akışlarına bir son tarih atanabilir. Çalışan bir iş akışı belirtilen süre içinde tamamlanmazsa Queuety onu başarısız olarak işaretler ve isteğe bağlı olarak bir işleyici çağırır. Duraklatılmış veya bir sinyal ya da başka iş akışlarını bekleyen iş akışlarının bekleme sırasında süresi dolmaz. Son tarihler yaklaşık dakikada bir, uzun süre çalışan bir `wp queuety work` süreci tarafından denetlenir; `--once` çalışanları veya WP-Cron yedeği bu denetimi yapmaz. Bu, süresiz çalışmaması gereken uzun iş akışları için bir devre kesici görevi görür.

## Son tarih belirleme

İzin verilen azami süreyi belirlemek için iş akışı oluşturucusunda `must_complete_within()` kullanın. Son tarih aşıldığında çalışan bir işleyici kaydetmek için `on_deadline()` kullanın.

```php
use Queuety\Queuety;

Queuety::workflow( 'data_import' )
    ->then( FetchDataHandler::class )
    ->then( TransformDataHandler::class )
    ->then( LoadDataHandler::class )
    ->must_complete_within( hours: 24 )
    ->on_deadline( ImportTimeoutHandler::class )
    ->dispatch( [ 'source' => $url ] );
```

`must_complete_within()` yöntemi, süreleri toplanan adlandırılmış parametreleri kabul eder:

```php
->must_complete_within( hours: 2, minutes: 30 )  // 2.5 hours
->must_complete_within( days: 1 )                 // 24 hours
->must_complete_within( seconds: 3600 )           // 1 hour
->must_complete_within( days: 1, hours: 12 )      // 36 hours
```

## Son tarih işleyicisi

`on_deadline()` işleyici sınıfı bir `handle( array $state ): void` yöntemi uygulamalıdır. Bu yöntem, genel iş akışı durumunu (`_` ile başlamayan tüm anahtarları) alır.

```php
class ImportTimeoutHandler {

    public function handle( array $state ): void {
        // Alert the team.
        wp_mail(
            'ops@example.com',
            'Import workflow timed out',
            'Workflow for source ' . ( $state['source'] ?? 'unknown' ) . ' exceeded its deadline.'
        );

        // Clean up partial work.
        if ( isset( $state['temp_file'] ) ) {
            unlink( $state['temp_file'] );
        }
    }
}
```

Son tarih işleyicisi isteğe bağlıdır. Özel mantık çalıştırmadan yalnızca iş akışının başarısız olmasını istiyorsanız, `on_deadline()` olmadan `must_complete_within()` kullanın.

## Son tarih denetimi nasıl çalışır

Çalışan, işleme döngüsünün bir parçası olarak süresi dolmuş son tarihleri her 60 saniyede bir denetler. `status` hâlâ `running` olan ve `deadline_at` geçmişte kalan bir iş akışı bulduğunda, kayıtlıysa `on_deadline` işleyicisini çağırır, iş akışını `Deadline exceeded` hata mesajıyla başarısız olarak işaretler ve bir `workflow_deadline_exceeded` günlük olayı kaydeder. Son tarih, iş akışı satırında `deadline_at` zaman damgası olarak saklanır ve yapılandırılmış süreden dağıtım anında hesaplanır.

## Süre dolduğunda ne olur

Bir iş akışının son tarihi aşıldığında durumu `failed` olarak değişir, hata mesajı `Deadline exceeded` olarak ayarlanır, kayıtlıysa son tarih işleyicisi eşzamanlı çalıştırılır ve bir `workflow_deadline_exceeded` günlük girdisi kaydedilir. Çalışan işler yürütmenin ortasında kesilmez, ancak iş akışı süresi dolan adım sınırının ötesine ilerlemez. Son tarih işleyicisinin kendisi bir istisna fırlatırsa, istisna sessizce yakalanır ve iş akışı yine de başarısız olur.

## WorkflowBuilder yöntemleri

| Yöntem | Açıklama |
|---|---|
| `must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 )` | İzin verilen azami süreyi belirler. Tüm parametreler toplanır. |
| `on_deadline( string $handler_class )` | Son tarih aşıldığında çağrılacak bir işleyici kaydeder. |

## Örnek: yeniden denemeli son tarih

Son tarihi nedeniyle başarısız olan bir iş akışını yeniden denemek nadiren işe yarar. `retry_workflow()` durumu `running` olarak sıfırlar ve başarısız adımı yeniden kuyruğa alır, ancak son tarihi temizlemez veya uzatmaz; bu nedenle bir dakika içinde gerçekleşecek bir sonraki son tarih denetimi iş akışını yeniden başarısız kılar. Bunun yerine yeni bir iş akışı dağıtın.

```php
$status = Queuety::workflow_status( $workflow_id );

if ( 'failed' === $status->status->value ) {
    // Check if it was a deadline failure.
    // You may want to dispatch a new workflow instead of retrying.
    Queuety::retry_workflow( $workflow_id );
}
```

## Son tarih ve bekleme gecikmeleri

Son tarihler iş akışının toplam süresi için geçerlidir. Bekleme gecikmeleri (`->delay()`), adım dizisinin bir parçası olarak iş akışını belirli bir süre duraklatır. 1 saatlik bekleme gecikmesi ve 2 saatlik son tarihi olan bir iş akışı, bekleme dışındaki adımlar toplamda 1 saatten uzun sürerse başarısız olur.
