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.
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.
payload
atraso e as executa trabalho, assim que sua teoria mencionado no Update 2 está erradotime()
paraDB::raw('NOW()')
apenas para ter certeza.Para conseguir isso, tudo o que você precisa fazer é decodificar sua carga útil, que será
Quando você decodificar sua carga, verá que o "comando" é serializado; portanto, a seguir, deserialize o "comando" .
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_encode
toda a carga útil e salvá-lo.Você também precisará seguir a resposta de @Julian Stark, ou seja, modificar a
available_at
tarefa.Eu espero que isso ajude.
fonte
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.
fonte