2016-02-07 13 views
6

Tôi có một công việc xếp hàng trong Laravel mà không xảy ra theo thời gian vì một API bên ngoài bị lỗi do tải cao. Vấn đề là các lựa chọn của tôi dường như có Hàng đợi Laravel tiếp tục búa API với các yêu cầu cho đến khi nó thành công hoặc yêu cầu nó dừng lại sau khi X số yêu cầu.Làm cách nào để tạo sự chậm trễ giữa các lần thử xếp hàng thất bại trong Laravel?

Có cách nào để tôi, dựa trên cách công việc thất bại, hãy yêu cầu nó thử lại sau 5 phút thay vì tiếp tục vứt đi?

Tôi muốn sử dụng trình xử lý xếp hàng sẵn có, nhưng chức năng thử lại dường như không được xây dựng để xử lý các tình huống thực tế của sự cố thất bại. Tôi nghĩ rằng nhiều lý do thất bại trong công việc sẽ không được giải quyết bằng cách ngay lập tức thử lại.

Trả lời

9

Những gì bạn có thể làm là một cái gì đó như thế này:

// app/Jobs/ExampleJob.php 
namespace App\Jobs; 

class ExampleJob extends Job 
{ 
    use \Illuminate\Queue\InteractsWithQueue; 

    public function handle() 
    { 
     try { 
      // Do stuff that might fail 
     } catch(AnException $e) { 
      // Example where you might want to retry 

      if ($this->attempts() < 3) { 
       $delayInSeconds = 5 * 60; 
       $this->release($delayInSeconds); 
      } 
     } catch(AnotherException $e) { 
      // Example where you don't want to retry 
      $this->delete(); 
     } 
    } 
} 

Xin lưu ý rằng bạn không cần phải làm điều này với trường hợp ngoại lệ, bạn cũng có thể chỉ cần kiểm tra kết quả từ hành động của bạn và quyết định từ đó.

+0

Cảm ơn, tôi đã hiểu nhầm về việc phát hành công việc. Ngoài ra, bạn đã tìm thấy hàm delete() ở đâu? Điều đó dường như không được ghi lại. Tôi hy vọng rằng có một cách hỗ trợ để loại bỏ công việc bằng cách đặt nó vào bảng công việc thất bại. – Citizen

+1

Tôi tìm thấy nó trong nguồn: https://github.com/laravel/framework/blob/5.1/src/Illuminate/Queue/InteractsWithQueue.php –

+3

Giới thiệu về việc thêm chúng vào bảng công việc thất bại. Tôi không hoàn toàn chắc chắn cách thức này hoạt động nhưng tôi tin rằng bạn có thể phải (lại) ném ngoại lệ để nó cũng được xử lý bởi công nhân xếp hàng. –

0

Bạn có thể tự giải phóng được công việc bằng cách sử dụng phương pháp Illuminate \ Queue \ InteractsWithQueue

$this->release(10); 

Đối số sẽ xác định số lượng giây cho đến khi công việc có sẵn một lần nữa.

Kiểm tra phần Phát hành thủ công việc trong official documentation cho phiên bản 5.1.

Các vấn đề liên quan