Queue is created but never executed

Asked

Viewed 94 times

-1

I’m trying to create queues to fire push notifications and emails from an API with Lumen. I got the Warninguser class that makes the shots like this:

<?php

namespace App\Utils;

use App\Jobs\ProcessNotification;
use App\Mail\AllMail;
use Illuminate\Support\Facades\Mail;

class WarningUser
{

  public static function send($user, $message, $url, $data = [])
  {
    $url = env('APP_URL_FRONT') . $url;
    dispatch(new ProcessNotification($user, $data, $message, $url));

    $emailData = EmailTexts::texts('pt', $data)[$message];
    Mail::to($user->email)->queue(new AllMail($emailData['title'], $emailData['content']));

    return true;
  }
}

The first Job sends the notification via Firebase:

<?php

namespace App\Jobs;

use Kreait\Firebase\Factory;
use Kreait\Firebase\Messaging\Notification;
use Kreait\Firebase\Messaging\CloudMessage;

class ProcessNotification extends Job
{
    protected $user = null;
    protected $data = null;
    protected $message = null;
    protected $url = null;

    public function __construct($user, $data, $message, $url)
    {
        $this->user = $user;
        $this->data = $data;
        $this->message = $message;
        $this->url = $url;
    }

    public function handle()
    {
        if (\is_string($this->user->token) and $this->user->token !== '') {
            $messaging = (new Factory())
                ->withServiceAccount(__DIR__.'/../../private-key.json')
                ->createMessaging();

            $notificationData = NotificationTexts::texts('pt', $this->data)[$this->message];
            $messageAlert = CloudMessage::withTarget('token', $this->user->token)
                ->withNotification(Notification::create($notificationData['title'], $notificationData['content']))
            ->withData([ 'url' => $this->url ]);

            $messaging->send($messageAlert);
        }
    }
}

The second sends a simple email:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class AllMail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;
    protected $title;
    protected $body;

    public function __construct($title, $body)
    {
        $this->title = $title;
        $this->body = $body;
    }

    public function build()
    {

        return $this
            ->subject($this->title)
            ->view('email')
        ->with([
            'title' => $this->title,
            'body' => $this->body
        ]);
    }
}

The code of the two work, I tested before putting in the queue and they work, I just put in the queue that no longer work. I looked in my bank, the Jobs are being stored as we can see in the image:

inserir a descrição da imagem aqui

But the queue is never being processed, I’ve already tried to run php artisan queue: work and php artisan queue: listen, but it never works.

The queue never even tries to be processed because it never has anything on the table failed_jobs.

Man config/queue.php is like this. And in mine . env I have the QUEUE_CONNECTION = database.

<?php

return [
    'default' => env('QUEUE_CONNECTION', 'database'),
    'connections' => [
        'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'retry_after' => 90,
        ],

        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host' => 'localhost',
            'queue' => 'default',
            'retry_after' => 90,
            'block_for' => 0,
        ],

        'sqs' => [
            'driver' => 'sqs',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
            'queue' => env('SQS_QUEUE', 'your-queue-name'),
            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => env('REDIS_QUEUE', 'default'),
            'retry_after' => 90,
            'block_for' => null,
        ],

    ],
    'failed' => [
        'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
        'database' => env('DB_CONNECTION', 'mongodb'),
        'table' => 'failed_jobs',
    ],
];

Can anyone help me? I’ve been on it for a while but I haven’t been able to progress.

PS: no error is shown in browser or terminal.

1 answer

0


I do not know why the negative vote on a valid and well documented question. Anyway, I managed to solve, for Mongo we need to use some more settings:

The connection in Queue.php should be:

'connections' => [
    'database' => [
        'driver' => 'mongodb',
        'table'  => 'jobs',
        'queue'  => 'default',
        'expire' => 60,
    ],
...

And we need to register the package provider that works with Mongo:

Jenssegers\Mongodb\MongodbQueueServiceProvider::class,

Browser other questions tagged

You are not signed in. Login or sign up in order to post.