J'ai un travail qui fonctionne parfaitement localement, mais dans la production, je rencontre des problèmes où cela ne fonctionne pas. J'ai englobé l'ensemble de la handle()
avec un try/catch
et je ne vois rien de connecté à Bugsnag, malgré de nombreuses autres exceptions ailleurs du déploiement.
public function handle() {
try {
// do stuff
} catch (\Exception $e) {
Bugsnag::notifyException($e);
throw $e;
}
}
Selon Laravel Horizon ce travail de file d'attente s'exécute pour 0.0026001930236816406
secondes et je ne le vois jamais fonctionner et je ne vois aucune autre erreur dans le failed_jobs
table en ce qui concerne ce travail.
config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => (60 * 10), // 10 minutes
'block_for' => null,
],
config/horizon.php
'environments' => [
'production' => [
'supervisor' => [
'connection' => 'redis',
'queue' => [
'default',
],
'balance' => 'auto',
'processes' => 10,
'tries' => 3,
// 10 seconds under the queue's retry_after to avoid overlap
'timeout' => (60 * 10) - 10, // Just under 10 mins
],
Si quelque chose fait que ce travail recommence encore et encore, comment savoir comment? Je suis à perte.
Enquête jusqu'à présent
SELECT DISTINCT exception, COUNT(id) as errors
FROM failed_jobs
WHERE payload LIKE '%[TAG-JOB-HAS]%'
GROUP BY exception;
Pour voir plus que ce message d'erreur:
Le travail a été tenté trop de fois ou exécuté trop longtemps
mais c'est tout ce que je vois.
Essayez d'attraper l'exception dans la méthode échouée donnée par laravel
/**
* The job failed to process.
*
* @param Exception $exception
* @return void
*/
public function failed(Exception $exception)
{
// Send user notification of failure, etc...
}
et vérifiez si votre pilote de file d'attente par défaut en local est synchronisé, puis son comportement attendu.
Selon documentation , vous pouvez gérer l'échec d'un travail de deux manières courantes:
failed()
.Dans le premier cas, vous pouvez gérer tous les travaux à l'aide de la méthode Queue::failing()
. Vous recevrez l'événement Illuminate\Queue\Events\JobFailed
En tant que paramètre, et il contient une exception.
Dans un autre cas, vous pouvez utiliser la méthode failed()
, elle doit être placée près de votre méthode handle()
. Vous pouvez également recevoir Exception $exception
Comme paramètre.
Exemple:
public function failed(\Throwable $exception)
{
// Log failure
}
J'espère que cela t'aides.
J'ai eu le même problème
Je l'ai corrigé en augmentant le paramètre 'retry_after'
assurez-vous que la valeur retry_after est supérieure au temps nécessaire à l'exécution d'un travail
dans config/queue.php fichier
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 9000,
],