Công việc xếp hàng của Laravel, Thực thi nó trước thời gian thực hiện


8

Tôi đã tạo một công việc Laravel để được thực hiện vào một ngày và thời gian cụ thể (ví dụ: ngày mai). Tôi muốn thêm một nút thủ công ghi đè thời gian và thực hiện công việc được xếp hàng đó trước thời gian thực hiện đã đặt. Nhấp vào nút tạo cuộc gọi ajax và gửi ID công việc đến máy chủ. Điều này sau đó dẫn đến công việc được thực hiện hôm nay thay vì ngày mai.

Chúng ta có thể thử lại các công việc thất bại bằng cách sử dụng lệnh sau: php artisan queue:retry JOBIDHERE

Tôi không chắc chắn những gì để sử dụng để thực hiện một công việc xếp hàng.

Tôi có thể nhận được ID công việc, nhưng tôi không biết liệu có thể thực hiện Công việc Laravel trước thời gian thực hiện đã đặt hay không.

Tôi đã tìm kiếm trên Google nhưng không tìm thấy ai có vấn đề và giải pháp như vậy.

Tôi đang sử dụng Laravel Ver 5.8. Sử dụng Mysql 5.7


Cập nhật:

Sau đây là tải trọng cho Công việc xếp hàng.

Tôi đã cố gắng sử dụng Json Decode và giải mã nó, nhưng tôi không chắc liệu có thể cập nhật lệnh cho hàng đợi đó để tôi có thể cập nhật ngày và giờ cho hàng đợi và lưu lại vào hồ sơ công việc được xếp hàng không.

{"displayName":"App\\Jobs\\Payway\\UpdateCustomerInvestment","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"delay":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App\\Jobs\\Payway\\UpdateCustomerInvestment","command":"O:40:\"App\\Jobs\\Payway\\UpdateCustomerInvestment\":17:{s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000transactionType\";s:7:\"payment\";s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000principalAmount\";d:9999;s:56:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000customerNumber\";s:4:\"BR-2\";s:50:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000currency\";s:3:\"aud\";s:58:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000singleUseTokenID\";N;s:55:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000payway_helper\";O:29:\"App\\Http\\Helpers\\PaywayHelper\":0:{}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000impodenceKey\";s:36:\"afedfc34-d08e-4831-a4aa-29de930d6b98\";s:49:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000headers\";a:0:{}s:60:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000localInvestmentObj\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:33:\"App\\Models\\Investment\\Investments\";s:2:\"id\";i:374;s:9:\"relations\";a:2:{i:0;s:8:\"investor\";i:1;s:13:\"investor.user\";}s:10:\"connection\";s:5:\"mysql\";}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000paywayTotals\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:38:\"App\\Models\\Banking\\Payway\\PaywayTotals\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";s:6:\"payway\";s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";O:13:\"Carbon\\Carbon\":3:{s:4:\"date\";s:26:\"2019-11-12 23:35:22.752222\";s:13:\"timezone_type\";i:3;s:8:\"timezone\";s:16:\"Australia\/Sydney\";}s:7:\"chained\";a:0:{}}"}}

Cập nhật 2:

Khi tôi giải tuần tự Lệnh tải trọng, tôi đã nhận được thông tin sau.

nhập mô tả hình ảnh ở đây

Vì vậy, tôi đang cố gắng cập nhật ngày trì hoãn đó, hy vọng nó sẽ hoạt động.

Nhưng từ câu trả lời của "Julian Stark", tôi cũng có thể phải cập nhật ready_at.

Lý thuyết của tôi là khi hàng đợi chạy, nó sẽ tìm kiếm việc làm dựa trên available_at. Tuy nhiên, khi công việc đang thực thi và nó có độ trễ, nó có thể không thực thi tại thời điểm cụ thể đó. Lý thuyết này vẫn chưa được thử nghiệm.

Tôi sẽ cập nhật cả hai dateTimes này và kiểm tra xem mọi thứ có hoạt động trơn tru không.

Câu trả lời:


11

Trong một trường hợp sử dụng tương tự, tôi chỉ cập nhật available_atthời gian công việc , vì vậy queue:listenlệnh thực thi công việc càng sớm càng tốt.

DB::table('jobs')->where('id', $jobId)->update(['available_at' => time()]);

Tôi không biết đây có phải là cách chính xác hay không, nhưng nó hiệu quả với tôi


Cập nhật câu hỏi của tôi với những phát hiện mới. Vui lòng kiểm tra xem. Cảm ơn bạn đã đề cập về có sẵn.
Mã nóng bỏng

Tôi đã kiểm tra ví dụ của mình trong laravel 5.8 mà không sửa đổi độ payloadtrễ và công việc thực thi, vì vậy lý thuyết của bạn được đề cập trong Bản cập nhật 2 là sai
Julian S

Tôi muốn thay đổi time()để DB::raw('NOW()')chắc chắn.
Styx

4

Để đạt được điều này, tất cả những gì bạn phải làm trước tiên là giải mã tải trọng của bạn sẽ là

{
   "displayName":"App\\Jobs\\Payway\\UpdateCustomerInvestment",
   "job":"Illuminate\\Queue\\CallQueuedHandler@call",
   "maxTries":null,
   "delay":null,
   "timeout":null,
   "timeoutAt":null,
   "data":{
      "commandName":"App\\Jobs\\Payway\\UpdateCustomerInvestment",
      "command":"O:40:\"App\\Jobs\\Payway\\UpdateCustomerInvestment\":17:{s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000transactionType\";s:7:\"payment\";s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000principalAmount\";d:9999;s:56:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000customerNumber\";s:4:\"BR-2\";s:50:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000currency\";s:3:\"aud\";s:58:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000singleUseTokenID\";N;s:55:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000payway_helper\";O:29:\"App\\Http\\Helpers\\PaywayHelper\":0:{}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000impodenceKey\";s:36:\"afedfc34-d08e-4831-a4aa-29de930d6b98\";s:49:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000headers\";a:0:{}s:60:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000localInvestmentObj\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:33:\"App\\Models\\Investment\\Investments\";s:2:\"id\";i:374;s:9:\"relations\";a:2:{i:0;s:8:\"investor\";i:1;s:13:\"investor.user\";}s:10:\"connection\";s:5:\"mysql\";}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000paywayTotals\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:38:\"App\\Models\\Banking\\Payway\\PaywayTotals\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";s:6:\"payway\";s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";O:13:\"Carbon\\Carbon\":3:{s:4:\"date\";s:26:\"2019-11-12 23:35:22.752222\";s:13:\"timezone_type\";i:3;s:8:\"timezone\";s:16:\"Australia\/Sydney\";}s:7:\"chained\";a:0:{}}"
   }
}

Khi bạn đã giải mã được trọng tải của mình, bạn sẽ thấy "lệnh" được tuần tự hóa, vì vậy tiếp theo bạn sẽ hủy kích hoạt "lệnh" .

[delay] => Array
        (
            [date] => 2019-11-12 23:35:22.752222
            [timezone_type] => 3
            [timezone] => Australia/Sydney
        )

Sau đó, bạn có thể cập nhật ngày theo nút trì hoãn và sử dụng ngày Carbon hoặc PHP, cập nhật ngày theo nhu cầu của bạn. Sau khi làm điều đó, bạn chỉ cần tuần tự hóa nút "lệnh" một lần nữa và sau đó json_encodetoàn bộ tải trọng và lưu nó.

Bạn cũng cần phải làm theo câu trả lời của @Julian Stark, nghĩa là sửa đổi available_atcông việc đó.

Tôi hi vọng cái này giúp được.


1
Tôi đã làm theo cùng một quy trình và cập nhật cả hai ngày. Đã làm việc hoàn hảo.
Mã nóng bỏng

1

cập nhật thời gian của công việc xếp hàng sẽ là một thực tiễn tồi thay vì bạn có thể xóa công việc theo lịch trình và chạy chức năng công văn ngay bây giờ.


1
Điều đó cũng có thể làm việc. Bạn không chắc tại sao phương pháp kia là một thực hành xấu? Cả hai phương pháp đều có vẻ tốt đối với tôi, Cập nhật ngày trực tiếp hoặc xóa hiện tại và tạo lại công việc. Nhưng tôi muốn xem làm thế nào chúng ta có thể cập nhật ngày / giờ của công việc hiện tại.
Mã nóng bỏng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.