4

I have multiple failed jobs on by failed_jobs. I tried requeue the MaxAttemptsExceededException but alwails fails. How to retry there type of jobs?

Note: Every time that I requeuing the job by php artisan queue:retry id command the jobs fails instantly. nor even execute the first line of code (app('log')->info('test');) of the listener.

Illuminate\Queue\MaxAttemptsExceededException: Froakie\Listeners\UploadPolicy has been attempted too many times or run too long. The job may have previously timed out. in /opt/dis/releases/20180906105455/vendor/illuminate/queue/Worker.php:394
Stack trace:
#0 /opt/dis/releases/20180906105455/vendor/illuminate/queue/Worker.php(314): Illuminate\Queue\Worker->markJobAsFailedIfAlreadyExceedsMaxAttempts('redis', Object(Illuminate\Queue\Jobs\RedisJob), 5)
#1 /opt/dis/releases/20180906105455/vendor/illuminate/queue/Worker.php(270): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#2 /opt/dis/releases/20180906105455/vendor/illuminate/queue/Worker.php(114): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#3 /opt/dis/releases/20180906105455/vendor/illuminate/queue/Console/WorkCommand.php(101): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions))
#4 /opt/dis/releases/20180906105455/vendor/illuminate/queue/Console/WorkCommand.php(85): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')
#5 [internal function]: Illuminate\Queue\Console\WorkCommand->handle()
#6 /opt/dis/releases/20180906105455/vendor/illuminate/container/BoundMethod.php(29): call_user_func_array(Array, Array)
#7 /opt/dis/releases/20180906105455/vendor/illuminate/container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#8 /opt/dis/releases/20180906105455/vendor/illuminate/container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Laravel\Lumen\Application), Array, Object(Closure))
#9 /opt/dis/releases/20180906105455/vendor/illuminate/container/Container.php(549): Illuminate\Container\BoundMethod::call(Object(Laravel\Lumen\Application), Array, Array, NULL)
#10 /opt/dis/releases/20180906105455/vendor/illuminate/console/Command.php(183): Illuminate\Container\Container->call(Array)
#11 /opt/dis/releases/20180906105455/vendor/symfony/console/Command/Command.php(251): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#12 /opt/dis/releases/20180906105455/vendor/illuminate/console/Command.php(170): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#13 /opt/dis/releases/20180906105455/vendor/symfony/console/Application.php(946): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#14 /opt/dis/releases/20180906105455/vendor/symfony/console/Application.php(248): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#15 /opt/dis/releases/20180906105455/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 /opt/dis/releases/20180906105455/vendor/illuminate/console/Application.php(88): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /opt/dis/releases/20180906105455/vendor/laravel/lumen-framework/src/Console/Kernel.php(84): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /opt/dis/releases/20180906105455/artisan(35): Laravel\Lumen\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 {main}

my listener:

<?php

namespace Froakie\Listeners;

use Carbon\Carbon;
use Froakie\Components\CRM\CrmFactory;
use Froakie\DTOs\Policy;
use Froakie\Events\PolicyIncoming;
use Froakie\Services\LeadsService;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

/**
 * Class UploadPolicy
 *
 * @package Froakie\Listeners
 * @author Miguel Borges <miguel.borges@edirectinsure.com>
 */
class UploadPolicy implements ShouldQueue
{
    use InteractsWithQueue;

    /**
     * The number of seconds the job can run before timing out.
     *
     * @var int
     */
    public $timeout = 180;

    /**
     * The number of times the job may be attempted.
     *
     * @var int
     */
    public $tries = 20;

    /**
     * @var \Froakie\Services\LeadsService
     */
    protected $leadsService;

    /**
     * Create the event listener.
     *
     * @param \Froakie\Services\LeadsService $leadsService
     */
    public function __construct(LeadsService $leadsService)
    {
        $this->leadsService = $leadsService;
    }

    /**
     * Handle the event.
     *
     * @param \Froakie\Events\PolicyIncoming $event
     * @throws \Exception
     */
    public function handle(PolicyIncoming $event)
    {
        try {
            app('log')->debug('UploadPolicy listener has catch a PolicyIncoming Event', ['event' => $event]);
            $crm = CrmFactory::getInstance()->getCRMLeadAdapter($event->crm);
            $crm->uploadPolicy($event->policy, $event->policyType, $event->lead, $event->options);

            app('log')->info(
                "A policy has been uploaded to lead {$event->lead->reference} in {$event->crm}",
                [
                    'reference' => $event->lead->reference
                ]
            );
        } catch (\Exception $exception) {
            $status = Policy::API_STATUS_DOWNLOAD_POLICY_RETRING;
            if ($this->attempts() >= $this->job->maxTries()) {
                $status = Policy::API_STATUS_DOWNLOAD_POLICY_FAILED;
            }
            $crm->updatePolicyAPIStatus($status, $event->lead, $event->options['personNumber']);
            app('log')->error("A error occurred on send policy of lead {$event->lead->reference} in {$event->crm}", [
                'event' => $event,
                'exception' => $exception
            ]);

            if ($this->attempts() < $this->job->maxTries()) {
                $this->release(Carbon::now()->addMinutes(fib($this->attempts())));
            } else {
                throw $exception;
            }
        }
    }

    /**
     * Determine the time at which the job should timeout.
     *
     * @return \DateTime
     */
    public function retryUntil()
    {
        return Carbon::now()->addMinutes(3);
    }
}
Miguel Borges
  • 7,549
  • 8
  • 39
  • 57

2 Answers2

2

This happen because the job uuid is not unique, probably is empty, so when the same class job fail multiple times in distinct jobs it causes all others jobs with the same class to insta fail.

You can run this to force the jobs to run

php artisan queue:worker --tries=9999999999999
  • I had the same problem and I tried to define the queue name using ```->onQueue('YOUR_QUEUE_NAME');```. After this change, all the selected jobs run instantly so I think it is a problem related to concurrency on the IDs or on related stuff. Thanks! – Stefano Jun 01 '21 at 19:38
  • This is sketchy as it could cause a job to clot the queue, taking worker as hostage forever until manually stopped. – Skywarth Mar 23 '22 at 14:19
-1

There's a section in the laravel documentation about this. Check it out here.

If the jobs keep failing again after you retry them, most likely there's an issue with your job that causes it to fail.

Tudor
  • 1,798
  • 2
  • 12
  • 21
  • 2
    Every time that I requeuing the job by php artisan queue:retry id command the jobs fails instantly. nor even execute the first line of code (app('log')->info('test');) of the listener. – Miguel Borges Sep 10 '18 at 13:18