SqsQueue.php
TLDR
The SqsQueue.php
file is a class that extends the Queue
class and implements the QueueContract
and ClearableQueue
interfaces. It provides methods for interacting with an Amazon SQS (Simple Queue Service) queue, such as getting the queue's size, pushing jobs onto the queue, receiving and processing jobs from the queue, and clearing the queue.
Methods
__construct
The constructor method initializes the SqsQueue
instance with the provided SQS client, default queue name, queue URL prefix, queue name suffix, and flag indicating whether to dispatch the job after committing a transaction.
size
This method returns the approximate number of messages in the specified queue. If no queue is provided, it returns the size of the default queue.
push
Pushes a new job onto the queue with the specified job class, job data, and optional queue name. It returns the ID of the message pushed to the queue.
pushRaw
Pushes a raw payload onto the queue with the specified payload, optional queue name, and additional options. It returns the ID of the message pushed to the queue.
later
Pushes a new job onto the queue after a specified delay period. The delay can be provided as a DateTimeInterface
, DateInterval
, or integer representing the number of seconds. The method accepts the job class, job data, and optional queue name parameters. It returns the ID of the message pushed to the queue.
bulk
Pushes an array of jobs onto the queue. Each job can have an optional delay specified. The method accepts the jobs array, job data, and optional queue name parameters.
pop
Pops the next job off the queue and returns an instance of SqsJob
if a job is available. If the queue is empty or no jobs are available, it returns null
.
clear
Deletes all jobs from the specified queue and returns the number of jobs deleted.
getQueue
Returns the specified queue or the default queue. If the specified queue is a valid URL, it is returned as is. Otherwise, the specified suffix is appended to the queue name (if not empty) and the prefix is prepended to the resulting queue name.
suffixQueue
Adds the given suffix to the given queue name. If the queue name ends with .fifo
, the .fifo
suffix is removed, and the queue name is suffixed with the specified suffix wrapped in a prefix. If the queue name does not end with .fifo
, the suffix is appended to the queue name wrapped in a prefix.
getSqs
Returns the underlying SQS client instance.
Classes
There are no additional classes in this file.
<?php
namespace Illuminate\Queue;
use Aws\Sqs\SqsClient;
use Illuminate\Contracts\Queue\ClearableQueue;
use Illuminate\Contracts\Queue\Queue as QueueContract;
use Illuminate\Queue\Jobs\SqsJob;
use Illuminate\Support\Str;
class SqsQueue extends Queue implements QueueContract, ClearableQueue
{
/**
* The Amazon SQS instance.
*
* @var \Aws\Sqs\SqsClient
*/
protected $sqs;
/**
* The name of the default queue.
*
* @var string
*/
protected $default;
/**
* The queue URL prefix.
*
* @var string
*/
protected $prefix;
/**
* The queue name suffix.
*
* @var string
*/
protected $suffix;
/**
* Create a new Amazon SQS queue instance.
*
* @param \Aws\Sqs\SqsClient $sqs
* @param string $default
* @param string $prefix
* @param string $suffix
* @param bool $dispatchAfterCommit
* @return void
*/
public function __construct(SqsClient $sqs,
$default,
$prefix = '',
$suffix = '',
$dispatchAfterCommit = false)
{
$this->sqs = $sqs;
$this->prefix = $prefix;
$this->default = $default;
$this->suffix = $suffix;
$this->dispatchAfterCommit = $dispatchAfterCommit;
}
/**
* Get the size of the queue.
*
* @param string|null $queue
* @return int
*/
public function size($queue = null)
{
$response = $this->sqs->getQueueAttributes([
'QueueUrl' => $this->getQueue($queue),
'AttributeNames' => ['ApproximateNumberOfMessages'],
]);
$attributes = $response->get('Attributes');
return (int) $attributes['ApproximateNumberOfMessages'];
}
/**
* Push a new job onto the queue.
*
* @param string $job
* @param mixed $data
* @param string|null $queue
* @return mixed
*/
public function push($job, $data = '', $queue = null)
{
return $this->enqueueUsing(
$job,
$this->createPayload($job, $queue ?: $this->default, $data),
$queue,
null,
function ($payload, $queue) {
return $this->pushRaw($payload, $queue);
}
);
}
/**
* 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 = [])
{
return $this->sqs->sendMessage([
'QueueUrl' => $this->getQueue($queue), 'MessageBody' => $payload,
])->get('MessageId');
}
/**
* 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->enqueueUsing(
$job,
$this->createPayload($job, $queue ?: $this->default, $data),
$queue,
$delay,
function ($payload, $queue, $delay) {
return $this->sqs->sendMessage([
'QueueUrl' => $this->getQueue($queue),
'MessageBody' => $payload,
'DelaySeconds' => $this->secondsUntil($delay),
])->get('MessageId');
}
);
}
/**
* Push an array of jobs onto the queue.
*
* @param array $jobs
* @param mixed $data
* @param string|null $queue
* @return void
*/
public function bulk($jobs, $data = '', $queue = null)
{
foreach ((array) $jobs as $job) {
if (isset($job->delay)) {
$this->later($job->delay, $job, $data, $queue);
} else {
$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)
{
$response = $this->sqs->receiveMessage([
'QueueUrl' => $queue = $this->getQueue($queue),
'AttributeNames' => ['ApproximateReceiveCount'],
]);
if (! is_null($response['Messages']) && count($response['Messages']) > 0) {
return new SqsJob(
$this->container, $this->sqs, $response['Messages'][0],
$this->connectionName, $queue
);
}
}
/**
* Delete all of the jobs from the queue.
*
* @param string $queue
* @return int
*/
public function clear($queue)
{
return tap($this->size($queue), function () use ($queue) {
$this->sqs->purgeQueue([
'QueueUrl' => $this->getQueue($queue),
]);
});
}
/**
* Get the queue or return the default.
*
* @param string|null $queue
* @return string
*/
public function getQueue($queue)
{
$queue = $queue ?: $this->default;
return filter_var($queue, FILTER_VALIDATE_URL) === false
? $this->suffixQueue($queue, $this->suffix)
: $queue;
}
/**
* Add the given suffix to the given queue name.
*
* @param string $queue
* @param string $suffix
* @return string
*/
protected function suffixQueue($queue, $suffix = '')
{
if (str_ends_with($queue, '.fifo')) {
$queue = Str::beforeLast($queue, '.fifo');
return rtrim($this->prefix, '/').'/'.Str::finish($queue, $suffix).'.fifo';
}
return rtrim($this->prefix, '/').'/'.Str::finish($queue, $this->suffix);
}
/**
* Get the underlying SQS instance.
*
* @return \Aws\Sqs\SqsClient
*/
public function getSqs()
{
return $this->sqs;
}
}