Trabalho na fila do Laravel, execute-o antes do tempo de execução

8

Criei um trabalho do Laravel para ser executado em uma data e hora específicas (por exemplo, amanhã). Quero adicionar um botão manual que substitua o tempo e execute esse trabalho na fila antes do tempo definido de execução. Clicar no botão cria uma chamada ajax e envia uma ID do trabalho para o servidor. Isso leva à execução do trabalho hoje, em vez de amanhã.

Podemos repetir manualmente trabalhos com falha usando o seguinte comando: php artisan queue:retry JOBIDHERE

Não sei o que usar para executar um trabalho na fila.

Posso obter o ID do trabalho, mas não sei se é possível executar o trabalho do Laravel antes do tempo definido de execução.

Pesquisei no Google, mas não encontrei ninguém com esse problema e solução.

Estou usando o Laravel Ver 5.8. Usando o Mysql 5.7


Atualizar:

A seguir, a carga útil do trabalho na fila.

Tentei usar o Json Decode e decodificá-lo, mas não tenho certeza se posso atualizar o comando para essa fila, para poder atualizar a data e a hora da fila e salvá-la no registro de trabalho na fila.

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

Atualização 2:

Quando desserializou o comando payload, obtive as seguintes informações.

insira a descrição da imagem aqui

Então, eu estou tentando atualizar essa data de atraso, espero que funcione.

Mas a partir da resposta de "Julian Stark", talvez seja necessário atualizar o available_at também.

Minha teoria é que, quando a fila for executada, ela buscará trabalhos com base available_at. No entanto, quando o trabalho está sendo executado e possui um atraso, ele pode não ser executado naquele momento específico. Essa teoria ainda está para ser testada.

Vou atualizar os dois dateTimes e verificar se tudo funciona sem problemas.

Sizzling Code
fonte

Respostas:

11

Em um caso de uso semelhante, atualizei o available_attempo dos trabalhos , para que o queue:listencomando execute o trabalho o mais rápido possível.

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

Não sei se essa é a maneira correta de fazê-lo, mas funcionou para mim

Julian S
fonte
Atualizei minha pergunta com novas descobertas. Por favor, verifique-os. Obrigado por mencionar sobre o available_at.
Código crepitante
Eu testei o meu exemplo em laravel 5.8 sem modificar o payloadatraso e as executa trabalho, assim que sua teoria mencionado no Update 2 está errado
Julian S
Eu mudaria time()para DB::raw('NOW()')apenas para ter certeza.
Styx
4

Para conseguir isso, tudo o que você precisa fazer é decodificar sua carga útil, que será

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

Quando você decodificar sua carga, verá que o "comando" é serializado; portanto, a seguir, deserialize o "comando" .

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

Depois disso, você pode atualizar a data no nó de atraso e, usando a data Carbon ou PHP, atualize a data conforme sua necessidade. Depois de fazer isso, basta serializar o nó "comando" novamente e, em seguida, json_encodetoda a carga útil e salvá-lo.

Você também precisará seguir a resposta de @Julian Stark, ou seja, modificar a available_attarefa.

Eu espero que isso ajude.

Fahad Ali
fonte
1
Eu já segui o mesmo processo e atualizei as duas datas. Já está trabalhando perfeitamente.
Código crepitante
1

atualizar a hora do trabalho na fila será uma prática recomendada. Em vez disso, você pode liberar o trabalho agendado e executar a função de despacho agora.

Furqan Ansari
fonte
1
Isso também pode funcionar. Não sei por que o outro método é uma má prática? Ambos os métodos me parecem bem, atualizando a data diretamente ou excluindo os existentes e criando trabalho novamente. Mas eu queria ver como podemos atualizar a data / hora do trabalho existente.
Código crepitante