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);
}
}
}