Lệnh Laravel được thử lại ngay cả khi số lần thử tùy chọn được đặt thành 1

Tram Ho

Lỗi như tiêu đề, bạn có thể xem tại https://github.com/laravel/framework/issues/15696
Và 1 lần nữa mấy anh contributors của laravel lại bảo đây là feature =))
https://github.com/laravel/framework/issues/15696#issuecomment-250935907

Tóm tắt lại là laravel sẽ chạy lại job sau khi job bị timeout bất kể bạn để try time bao nhiêu lần.
Đọc code của laravel bạn sẽ thấy. IlluminateQueueWorker::markJobAsFailedIfAlreadyExceedsMaxAttempts

Cách fix:

1. Set option retry_after và restart queue mỗi 1 khoảng thời gian < retry_after time

Ví dụ: Bạn set job retry_after bằng 3600 s và restart queue mỗi 2000s.

2. Chia nhỏ job thằng nhiều job con.

Nếu job của bạn đang thực hiện 1 công việc có thể chia nhỏ hơn, hay tạo ra job con và dispatch các job con trong job cha để tránh timeout.

3. Tạo 1 class extends từ class IlluminateQueueWorker và ghi đè funtion markJobAsFailedIfAlreadyExceedsMaxAttempts

Đơn giản là xóa 3 cái dòng của nợ kia đi.

Và đừng quên viết 1 console lệnh cho class worker mới nhé. Tham khảo code ở file vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php
Bạn nào viết xong chia sẻ lại cho mình nhé, mình chưa viết =))

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo