Job thất bại khi ném exception chưa bắt và đã dùng hết số lần thử. Khi đó Laravel ghi một dòng vào bảng failed_jobs và ngừng chạy lại job đó.
Các tham số điều khiển:
php
class SyncInvoice implements ShouldQueue
{
public int $tries = 3; // tổng số lần thử
public int $timeout = 60; // giây, quá thì worker giết job
public array $backoff = [10, 60, 300]; // chờ giữa các lần thử
public function retryUntil(): \DateTime // ưu tiên hơn $tries
{
return now()->addMinutes(30);
}
public function handle(): void { /* ... */ }
public function failed(\Throwable $e): void
{
// chạy đúng MỘT lần khi job chính thức thất bại
Log::error('invoice sync failed', ['id' => $this->invoiceId, 'e' => $e->getMessage()]);
}
}$triesđặt trên job được ưu tiên hơn cờ--triescủa worker.$backofflà mảng thì mỗi lần thử dùng một giá trị; hết mảng thì lặp giá trị cuối — cách làm exponential backoff.retryUntil()đặt hạn chót theo thời gian, thử lại bao nhiêu lần cũng được cho tới mốc đó; khi đã có nó thì không cần$tries.- Xem lại và chạy lại bằng
php artisan queue:failed,queue:retry <id>/queue:retry all.
Lưu ý vận hành: job phải idempotent vì có thể chạy lại; và sau khi deploy code mới phải queue:restart, nếu không worker cũ vẫn giữ code cũ trong bộ nhớ.