master

laravel/framework

Last updated at: 29/12/2023 09:24

SyncQueue.php

TLDR

The provided file, SyncQueue.php, is a class in the Illuminate\Queue namespace. The class represents a synchronous queue and extends the parent Queue class and implements the QueueContract interface. It contains methods for managing the queue, such as pushing and executing jobs synchronously.

Methods

size

This method returns the size of the queue.

push

This method pushes a new job onto the queue. It accepts the job name, job data, and an optional queue name as parameters. It executes the job synchronously by calling the executeJob method.

executeJob

This protected method is responsible for executing a given job synchronously. It accepts the job name, job data, and an optional queue name as parameters. It creates a SyncJob instance and fires the job. It handles any exceptions that occur during job execution by calling the handleException method.

resolveJob

This protected method resolves a SyncJob instance based on the job payload and queue name. It returns the resolved SyncJob instance.

raiseBeforeJobEvent

This protected method raises the before queue job event if the container contains the events binding. It dispatches a new JobProcessing event with the connection name and the job instance as parameters.

raiseAfterJobEvent

This protected method raises the after queue job event if the container contains the events binding. It dispatches a new JobProcessed event with the connection name and the job instance as parameters.

raiseExceptionOccurredJobEvent

This protected method raises the exception occurred queue job event if the container contains the events binding. It dispatches a new JobExceptionOccurred event with the connection name, the job instance, and the exception instance as parameters.

handleException

This protected method handles an exception that occurred while processing a job. It raises the exception occurred queue job event by calling the raiseExceptionOccurredJobEvent method, fails the job, and re-throws the exception.

pushRaw

This method is responsible for pushing a raw payload onto the queue. It accepts the payload, an optional queue name, and an array of options as parameters.

later

This method is responsible for pushing a new job onto the queue after a specified time delay. It accepts the delay (either a DateTimeInterface, DateInterval, or an integer representing the number of seconds), the job name, job data, and an optional queue name as parameters. It simply calls the push method to push the job onto the queue.

pop

This method is responsible for popping the next job off of the queue. It accepts an optional queue name as a parameter. It returns a Job instance or null.

<?php

namespace Illuminate\Queue;

use Illuminate\Contracts\Queue\Job;
use Illuminate\Contracts\Queue\Queue as QueueContract;
use Illuminate\Queue\Events\JobExceptionOccurred;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Queue\Jobs\SyncJob;
use Throwable;

class SyncQueue extends Queue implements QueueContract
{
    /**
     * Get the size of the queue.
     *
     * @param  string|null  $queue
     * @return int
     */
    public function size($queue = null)
    {
        return 0;
    }

    /**
     * Push a new job onto the queue.
     *
     * @param  string  $job
     * @param  mixed  $data
     * @param  string|null  $queue
     * @return mixed
     *
     * @throws \Throwable
     */
    public function push($job, $data = '', $queue = null)
    {
        if ($this->shouldDispatchAfterCommit($job) &&
            $this->container->bound('db.transactions')) {
            return $this->container->make('db.transactions')->addCallback(
                fn () => $this->executeJob($job, $data, $queue)
            );
        }

        return $this->executeJob($job, $data, $queue);
    }

    /**
     * Execute a given job synchronously.
     *
     * @param  string  $job
     * @param  mixed  $data
     * @param  string|null  $queue
     * @return int
     *
     * @throws \Throwable
     */
    protected function executeJob($job, $data = '', $queue = null)
    {
        $queueJob = $this->resolveJob($this->createPayload($job, $queue, $data), $queue);

        try {
            $this->raiseBeforeJobEvent($queueJob);

            $queueJob->fire();

            $this->raiseAfterJobEvent($queueJob);
        } catch (Throwable $e) {
            $this->handleException($queueJob, $e);
        }

        return 0;
    }

    /**
     * Resolve a Sync job instance.
     *
     * @param  string  $payload
     * @param  string  $queue
     * @return \Illuminate\Queue\Jobs\SyncJob
     */
    protected function resolveJob($payload, $queue)
    {
        return new SyncJob($this->container, $payload, $this->connectionName, $queue);
    }

    /**
     * Raise the before queue job event.
     *
     * @param  \Illuminate\Contracts\Queue\Job  $job
     * @return void
     */
    protected function raiseBeforeJobEvent(Job $job)
    {
        if ($this->container->bound('events')) {
            $this->container['events']->dispatch(new JobProcessing($this->connectionName, $job));
        }
    }

    /**
     * Raise the after queue job event.
     *
     * @param  \Illuminate\Contracts\Queue\Job  $job
     * @return void
     */
    protected function raiseAfterJobEvent(Job $job)
    {
        if ($this->container->bound('events')) {
            $this->container['events']->dispatch(new JobProcessed($this->connectionName, $job));
        }
    }

    /**
     * Raise the exception occurred queue job event.
     *
     * @param  \Illuminate\Contracts\Queue\Job  $job
     * @param  \Throwable  $e
     * @return void
     */
    protected function raiseExceptionOccurredJobEvent(Job $job, Throwable $e)
    {
        if ($this->container->bound('events')) {
            $this->container['events']->dispatch(new JobExceptionOccurred($this->connectionName, $job, $e));
        }
    }

    /**
     * Handle an exception that occurred while processing a job.
     *
     * @param  \Illuminate\Contracts\Queue\Job  $queueJob
     * @param  \Throwable  $e
     * @return void
     *
     * @throws \Throwable
     */
    protected function handleException(Job $queueJob, Throwable $e)
    {
        $this->raiseExceptionOccurredJobEvent($queueJob, $e);

        $queueJob->fail($e);

        throw $e;
    }

    /**
     * Push a raw payload onto the queue.
     *
     * @param  string  $payload
     * @param  string|null  $queue
     * @param  array  $options
     * @return mixed
     */
    public function pushRaw($payload, $queue = null, array $options = [])
    {
        //
    }

    /**
     * Push a new job onto the queue after (n) seconds.
     *
     * @param  \DateTimeInterface|\DateInterval|int  $delay
     * @param  string  $job
     * @param  mixed  $data
     * @param  string|null  $queue
     * @return mixed
     */
    public function later($delay, $job, $data = '', $queue = null)
    {
        return $this->push($job, $data, $queue);
    }

    /**
     * Pop the next job off of the queue.
     *
     * @param  string|null  $queue
     * @return \Illuminate\Contracts\Queue\Job|null
     */
    public function pop($queue = null)
    {
        //
    }
}