Laravel поставил задание в очередь, выполнил его до времени выполнения

Laravel поставил задание в очередь, выполнил его до времени выполнения

08.11.2019 09:49:27 Просмотров 77 Источник

Я создал задание laravel для выполнения в определенную дату и время, скажем, на завтра, но я хочу иметь ручную кнопку, которая может переопределить время и выполнить это задание в очереди до его установленного времени выполнения,

так что, если я нажму кнопку, вызов ajax будет создан на сервер с идентификатором задания, отправленным на него, и он выполнит это задание сегодня, а не завтра.

Для неудачных заданий у нас есть возможность вручную повторить это неудачное задание. Для этого мы можем использовать следующую команду.

php artisan queue:retry JOBIDHERE

но я не уверен, что использовать для выполнения уже поставленного в очередь задания, которое ставится в очередь для выполнения позже.

Я могу получить идентификатор работы. Его просто можно выполнить задание Laravel до установленного времени его выполнения.

Я искал google, но не нашел никого с такой проблемой и решением.

Я использую Laravel Ver 5.8. Использование MySQL 5.7


Обновление:

Ниже приведены полезные данные для задания в очереди.

Я попытался использовать JSON Decode и декодировал его, но я не уверен, что могу обновить команду для этой очереди, чтобы я мог обновить дату и время для очереди и сохранить ее обратно в запись задания в очереди.

{"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:{}}"}}

Обновление 2:

Когда я необходимо выполнить десериализацию шник.

я получил следующую информацию.

enter image description here

Поэтому я пытаюсь обновить эту дату задержки, надеюсь, это сработает.

Но из ответа "Джулиан Старк", Я, возможно, также придется обновить available_at, а также.

Поэтому моя теория заключается в том , что когда очередь запускается, она будет искать задания на основе available_at, но когда задание выполняется и у него будет задержка, оно может не выполняться в это конкретное время. Это всего лишь теория, еще не проверенная.

Я обновлю оба этих времени и проверю, все ли работает гладко.

У вопроса есть решение - Посмотреть?

Ответы - Laravel поставил задание в очередь, выполнил его до времени выполнения / Laravel Queued Job, Execute it before its execution time

Является ответом!
Julian Stark

12.11.2019 11:18:45

В аналогичном случае использования я просто обновил задания available_attime, поэтому команда queue:listenвыполняет задание как можно скорее.

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

Я не знаю, если это правильный способ сделать это, но это сработало для меня

https://stackoverflow.com/questions/58772246/laravel-queued-job-execute-it-before-its-execution-time/58814587#comment103907372_58814587
это должно работать: O
https://stackoverflow.com/questions/58772246/laravel-queued-job-execute-it-before-its-execution-time/58814587#comment103907840_58814587
Обновил мой вопрос с новыми выводами. Пожалуйста, проверьте их. Спасибо за упоминание о available_at.
https://stackoverflow.com/questions/58772246/laravel-queued-job-execute-it-before-its-execution-time/58814587#comment103908083_58814587
Я протестировал свой пример в laravel 5.8 без изменения задержки полезной нагрузки и выполнения задания, поэтому ваша теория, упомянутая в обновлении 2, неверна
https://stackoverflow.com/questions/58772246/laravel-queued-job-execute-it-before-its-execution-time/58814587#comment103977797_58814587
Я бы изменил time()на DB::raw('NOW()'), чтобы быть уверенным.
Furqan Ansari

14.11.2019 03:03:16

обновление времени задания в очереди будет плохой практикой, вместо этого вы можете сбросить запланированное задание и запустить функцию dispatch now.

https://stackoverflow.com/questions/58772246/laravel-queued-job-execute-it-before-its-execution-time/58856363#comment104022004_58856363
Это тоже может сработать. Но я не уверен, почему другой метод является плохой практикой? Оба метода кажутся мне прекрасными, обновляя дату напрямую или удаляя существующую и создавая задание снова. Но я хотел посмотреть, как мы можем обновить дату / время существующей работы.
Fahad Ali

15.11.2019 03:29:50

Чтобы достичь этого, все, что вам нужно сделать, это сначала декодировать полезную нагрузку, которая будет

{
   "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:{}}"
   }
}

Когда вы расшифруете свою полезную нагрузку, вы увидите, что" команда " сериализуется, поэтому далее вам нужно отменить сериализацию "команды" .

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

После этого вы можете обновить дату в узле задержки и либо с помощью Carbon, либо PHP date, обновить дату в соответствии с вашими потребностями. После этого вам просто нужно снова сериализовать узел "command", а затем json_encodeвсю полезную нагрузку и сохранить ее.

Вам также нужно будет следовать ответу @Julian Stark, то есть изменить available_atэтой работы.

Надеюсь, это поможет.

https://stackoverflow.com/questions/58772246/laravel-queued-job-execute-it-before-its-execution-time/58877126#comment104021669_58877126
Я уже следовал тому же процессу и обновил обе даты. Уже работает безупречно.
Закрыть X