Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel queue randomly not dispatching

Tags:

php

laravel

I'm trying to dispatch jobs from a controller, but sometimes the queue works, and sometimes it will execute the code immediately. On the other hand, dispatching from a command works fine, so I wonder what the difference could be.

Things that I have tried:

  • I tried database and Redis connections and got the problem for both connections
  • Without running queue listen/work, the job will randomly execute, so listen/work cannot be the problem
  • Checked webserver/PHP log for errors, no result
  • Something goes wrong before the static dispatch function. When I put a die in the static dispatch function, it will sometimes kill the app, and sometimes it will still run decode in the handle immediately....

vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php

public static function dispatch()
{
    die('xxx');
    
    return new PendingDispatch(new static(...func_get_args()));
}

I'm trying to find what happened before the dispatch function, but I cannot find any function that executes before the static handle function. I have the feeling that something is crashing in PHP and alternatively execute the job immediately, but I cannot find where that happens in the core.

Controller

class CreateTestJob
{
    public function __invoke(Request $request)
    {
        TestJob::dispatch(rand(0, 999999));
    }
}

Job

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

    public function __construct($test)
    {
        $this->test = $test;
    }

    public function handle()
    {
        sleep(30);

        echo 'done';
    }
}

I also tried to create a syntax error in de handle function of the TestJob so that I can see the stack trace, but it shows "1 unknown frame". I wonder what that is

Stacktrace

like image 341
jason_decode Avatar asked May 01 '26 18:05

jason_decode


2 Answers

  1. you can check fail_jobs table if there is any error while running your job.

  2. The job will be immediately executed only when you use synchronous driver or synchronous dispatch(for use in local development).

    <?php Somejob::dispatchSync();

  3. Jobs on Redis and database connection will be executed only when you run queue worker.

    php artisan queue:work

like image 107
Zaw Htet Naing Avatar answered May 04 '26 07:05

Zaw Htet Naing


It could also be that the cache needs to be cleared.

The job lock in the cache can get stuck under certain conditions if the job fails.

I have had this problem with using the Sync driver and the Database driver. The solution is to run php artisan cache:clear This releases the lock on the job and allows it to run the next time you despatch it.

like image 21
Mr U. Avatar answered May 04 '26 07:05

Mr U.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!