Queues

Introduction

The Maravel queue service provides a unified API across a variety of different queue back-ends. Queues allow you to defer the processing of a time consuming task, such as performing a task on a remote server, until a later time which drastically speeds up web requests to your application.

Like many other parts of the framework, Maravel’s queued jobs function are almost identically to Maravelith’s queued jobs. So, to learn more about queuing jobs in Maravel, please review the full Maravelith queue documentation.

Note: Closure jobs are not supported by Maravel.

Configuration

The queue configuration options are in the .env file.

If you would like to thoroughly customize the queue configuration, then you must copy the entire vendor/macropay-solutions/maravel-framework/config/queue.php file to the config directory in the root of your project and adjust the necessary configuration options as needed. If the config directory does not exist, then you should create it.

After creating the configuration file, ensure that the configuration file is loaded via your bootstrap/app.php file:

$app->configure('queue');

Driver Prerequisites

Database

In order to use the database queue driver, you will need database tables to hold the jobs and failures. You may execute the php artisan queue:table Artisan command to generate a migration for the jobs table, while the php artisan queue:failed-table command may be used to generate a migration for the failed-jobs table:

Schema::create('jobs', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('queue');
    $table->longText('payload');
    $table->tinyInteger('attempts')->unsigned();
    $table->unsignedInteger('reserved_at')->nullable();
    $table->unsignedInteger('available_at');
    $table->unsignedInteger('created_at');
    $table->index(['queue', 'reserved_at']);
});

Schema::create('failed_jobs', function (Blueprint $table) {
    $table->increments('id');
    $table->text('connection');
    $table->text('queue');
    $table->longText('payload');
    $table->longText('exception');
    $table->timestamp('failed_at')->useCurrent();
});

Redis

In order to use the Redis queue driver, you will need to install the illuminate/redis package via Composer. Then, you should register the Illuminate\Redis\RedisServiceProvider in your bootstrap/app.php file.

Other Queue Dependencies

The following dependencies are needed for the listed queue drivers:

  • Amazon SQS: aws/aws-sdk-php ~3.0
  • Beanstalkd: pda/pheanstalk ~3.0

Differences From Maravelith

Like many other parts of the framework, Maravel’s queued jobs function identically to Maravelith’s queued jobs. So, to learn more about queuing jobs in Maravel, please review the full Maravelith queue documentation.

However, there are a few minor differences that we will discuss now. First, let’s talk about how queued jobs are generated in Maravel.

Generators

Maravel does not include generators for automatically creating new Job classes. Instead, you should copy the ExampleJob class that is included with the framework. This class provides the basic structure that is shared by every Job class. The base Job that is used by the ExampleJob already includes the needed InteractsWithQueue, Queueable, and SerializesModels traits:

<?php

namespace App\Jobs;

class ExampleJob extends Job
{
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

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

Dispatching Jobs

Again, you should consult the full Maravelith queue documentation for complete information on dispatching queued jobs; however, just like in the Maravelith framework, you may use the dispatch function to dispatch jobs from anywhere within your Maravel application:

dispatch(new ExampleJob);

Of course, you may also use the Queue facade. If you choose to use the facade, be sure to uncomment the call to $app->withFacades() in your bootstrap/app.php file:

Queue::push(new ExampleJob);

\Illuminate\Support\Facades\Queue::push should not be used in combination with ShouldBeUnique!

SQS FIFO and Fair Queues

Maravel Framework supports Amazon SQS FIFO (First-In-First-Out) queues through message deduplication.

Example:

\dispatch(new JobExample($payload))->onGroup('customer-' . $payload['customer_id']);

Implement a deduplicationId method with string return type in your job to prevent for 5 minutes duplicate dispatches (if not, a default Str::orderedUuid()->toString() will be used meaning duplicates will be processed):

/**
 * Get the job's deduplication ID.
 */
public function deduplicationId(): string
{
    return 'prefix-' . $this->customId;
}

This site uses Just the Docs, a documentation theme for Jekyll.