master

laravel/framework

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

ThrottlesExceptionsWithRedis.php

TLDR

This file contains the ThrottlesExceptionsWithRedis class, which is a subclass of ThrottlesExceptions class. It implements a middleware that throttles the processing of jobs by using Redis to limit the rate at which jobs are executed.

Methods (if applicable)

This file does not contain any additional methods.

Classes (if applicable)

ThrottlesExceptionsWithRedis

This class extends the ThrottlesExceptions class and implements a middleware that throttles the processing of jobs. It uses Redis to limit the rate at which jobs can be executed. The handle method is responsible for processing the jobs and implementing the rate limiting logic.

<?php

namespace Illuminate\Queue\Middleware;

use Illuminate\Container\Container;
use Illuminate\Contracts\Redis\Factory as Redis;
use Illuminate\Redis\Limiters\DurationLimiter;
use Illuminate\Support\InteractsWithTime;
use Throwable;

class ThrottlesExceptionsWithRedis extends ThrottlesExceptions
{
    use InteractsWithTime;

    /**
     * The Redis factory implementation.
     *
     * @var \Illuminate\Contracts\Redis\Factory
     */
    protected $redis;

    /**
     * The rate limiter instance.
     *
     * @var \Illuminate\Redis\Limiters\DurationLimiter
     */
    protected $limiter;

    /**
     * Process the job.
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    public function handle($job, $next)
    {
        $this->redis = Container::getInstance()->make(Redis::class);

        $this->limiter = new DurationLimiter(
            $this->redis, $this->getKey($job), $this->maxAttempts, $this->decaySeconds
        );

        if ($this->limiter->tooManyAttempts()) {
            return $job->release($this->limiter->decaysAt - $this->currentTime());
        }

        try {
            $next($job);

            $this->limiter->clear();
        } catch (Throwable $throwable) {
            if ($this->whenCallback && ! call_user_func($this->whenCallback, $throwable)) {
                throw $throwable;
            }

            $this->limiter->acquire();

            return $job->release($this->retryAfterMinutes * 60);
        }
    }
}