Laravel Queued Job, выполнить его до времени выполнения - PullRequest
3 голосов
/ 08 ноября 2019

Я создал задание 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, но когда задание выполняется и будет иметь задержку, оно может не исполниться в это конкретное время. Это - только теория, еще не проверенная.

Вы обновите оба этих dateTimes и проверите, все ли работает гладко.

Ответы [ 3 ]

5 голосов
/ 12 ноября 2019

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

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

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

2 голосов
/ 15 ноября 2019

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

{
   "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
        )

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

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

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

0 голосов
/ 14 ноября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...