Wednesday, March 21, 2018

Laravel – Queues reporting as failed (even though they don’t) - development

Laravel – Queues reporting as failed (even though they don’t)

I am using the latest version of Homestead.
I also have Laravel Horizon set up.
I am using redis as the queue driver.

What’s happening is my jobs are all failing (even though the job exits correctly).

I am running the job through command line by using a custom command:

vagrant@homestead:~/myapp$ artisan crawl:start
vagrant@homestead:~/myapp$ <-- No CLI errors after running

app/Console/Command/crawl.php

<?php

namespace MyAppConsoleCommands;

use IlluminateConsoleCommand;
use MyAppJobsCrawl;

class crawl extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'crawl:start';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Start long running job.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {


        Crawl::dispatch();

    }

}

app/Jobs/Crawl.php

<?php

namespace MyAppJobs;

use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;

class Crawl implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

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

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

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {

    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {


        $crawl = new Crawl();
        $crawl->start();


    }
}

app/Crawl.php

<?php
namespace MyApp;

class Crawl
{

    public function start()
    {

        ini_set('memory_limit','256M');
        set_time_limit(3600);

        echo "Started."; 
        sleep(30);
        echo "Exited.";
        exit(); 

    }
}

worker.log

[2018-03-21 10:14:27][1] Processing: MyAppJobsCrawl
Started.
Exited.
[2018-03-21 10:15:59][1] Processing: MyAppJobsCrawl
[2018-03-21 10:15:59][1] Failed:     MyAppJobsCrawl

From Horizon’s failed job detail

Failed At    18-03-21 10:15:59
Error        IlluminateQueueMaxAttemptsExceededException:
             MyAppJobsCrawl has been attempted too many 
             times or run too long. The job may have previously 
             timed out. in /home/vagrant/app/vendor/laravel
             /framework/src/Illuminate/Queue/Worker.php:396

laravel-worker.conf

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/myapp/artisan queue:work --sleep=3 --tries=1 --timeout=3600
autostart=true
autorestart=true
user=vagrant
numprocs=1
redirect_stderr=true
stdout_logfile=/home/vagrant/myapp/worker.log

Synopsis

Looking at my worker.log I can see that the output from my class has worked:

Started.
Exited.

But the job is reported as failed. Why?

Any help is greatly appreciated!



from Laravel Questions and Answers https://laravelquestions.com/laravel/laravel-queues-reporting-as-failed-even-though-they-dont/
via Lzo Media

No comments:

Post a Comment