Laravel Jobs Batching

Laravel Jobs Batching

Laravel 8 has unveiled a much-anticipated feature known as Laravel Jobs Batching, enabling the simultaneous execution of multiple tasks and flexible progress monitoring, even in the presence of errors.

To commence, execute the following commands to create the job_batches table for storing information about job batches:

php artisan queue:batches-table
php artisan migrate

Finding Batch by ID

To retrieve batch information based on its ID, utilize the Bus facade with the findBatch method:

$batch = Bus::findBatch("909db655-ed38-4739-89ea-ca6c1b13a5a0");

Callbacks

Bus::batch() provides several functionalities in the form of callbacks:

  • then: Executed when all jobs are successful.
  • catch: Executed when errors occur during the execution of any job in the batch.
  • finally: Executed when all jobs conclude processing, regardless of success or failure.
$batch = Bus::batch([
    new ImportExcel(1, 100),
    new ImportExcel(101, 200),
    new ImportExcel(201, 300),
    new ImportExcel(301, 400),
    new ImportExcel(401, 500),
])->progress(function (Batch $batch) {
    // A single job has completed successfully...
})->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

Batch Object

The Batch Object comprises useful properties providing information about the batch and the status of its jobs.

{
    "id": "941eaf3c-7e03-4861-92b9-49713402b9e4",
    "name": "",
    "total_jobs": 0,
    "pending_jobs": 0,
    "failed_jobs": 0,
    "failed_job_ids": "[]",
    "options": "a:0:{}",
    "cancelled_at": null,
    "created_at": 1628595099,
    "finished_at": null
}

Now, having grasped the feature, let's delve into an example to solidify understanding of job batches.

Creating a User Addition Job

Firstly, we need a job to add mock data to the users' table. Run the following command to the job:

php artisan make:job CreateUserJob

Next, open the CreateUserJob.php file in the app/Jobs directory and modify it as follows:

// CreateUserJob.php

namespace App\Jobs;

use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class CreateUserJob implements ShouldQueue
{
    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
        //
    }

    public function handle()
    {
        \App\Models\User::factory(10)->create();
    }
}

Note: When utilizing job batches, include the following facade; it is not automatically added when creating a job:

use Illuminate\Bus\Batchable;

Verifying Laravel Job Batches Activity

In this step, we need to add a controller to execute the job.

To achieve this, run the following command:

php artisan make:controller TestQueueJobController

Now, open TestQueueJobController.php and update it:

// TestQueueJobController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Jobs\CreateUserJob;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

class TestQueueJobController extends Controller
{
    public function run()
    {
        $batch = Bus::batch([
            new CreateUserJob(),
            new CreateUserJob()
        ])->dispatch();
    }
}

Then, open routes/web.php and add the following line:

Route::get('job-batches', [App\Http\Controllers\TestQueueJobController::class,'run']);

Now, access the /job-batches URL in your browser to execute the user creation job.

After a job is processed, handle the queue with the following command:

php artisan queue:work

Upon completion, you'll have 20 new users added to the users table.

In conclusion, we've successfully demonstrated a simple example of Laravel Queue. I hope this guide proves helpful for your tasks. If you have any questions, feel free to contact us through the provided contact page. Thank you.