web-dev-qa-db-fra.com

Le travail a été tenté trop de fois ou exécuté trop longtemps

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

  • Je m'attends à ce que je devrais pouvoir exécuter la requête:
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.

  • Laravel Horizon Le tableau de bord montre que le travail en question est en cours d'exécution pendant <1 seconde, donc je sais que ce n'est pas réellement le délai d'attente.
11
Webnet

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.

6
Anil Kumar

Selon documentation , vous pouvez gérer l'échec d'un travail de deux manières courantes:

  • à l'aide d'événements de travail ayant échoué
  • en utilisant la méthode 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.

4
a_sarana

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,
    ],
0
Yasser