Файл: vendor/laravel/framework/src/Illuminate/Foundation/Cloud/Queue.php
Строк: 403
<?php
namespace IlluminateFoundationCloud;
use CarbonCarbonImmutable;
use IlluminateContractsQueueClearableQueue;
use IlluminateContractsQueueQueue as QueueContract;
use IlluminateSupportStr;
use IlluminateSupportTraitsForwardsCalls;
class Queue implements QueueContract, ClearableQueue
{
use ForwardsCalls;
/**
* The currently processing job.
*
* @var IlluminateContractsQueueJob|null
*/
protected $processingJob = null;
/**
* The queue for the currently processing job.
*
* @var string|null
*/
protected $processingQueue = null;
/**
* The date the last job started processing.
*
* @var CarbonCarbonImmutable
*/
protected $processingJobStartedAt = null;
/**
* Create a new Queue instance.
*/
public function __construct(
protected QueueContract $queue,
protected Events $events,
protected array $config,
) {
//
}
/**
* Get the size of the queue.
*
* @param string|null $queue
* @return int
*/
public function size($queue = null)
{
return $this->queue->size(...func_get_args());
}
/**
* Get the number of pending jobs.
*
* @param string|null $queue
* @return int
*/
public function pendingSize($queue = null)
{
return $this->queue->pendingSize(...func_get_args());
}
/**
* Get the number of delayed jobs.
*
* @param string|null $queue
* @return int
*/
public function delayedSize($queue = null)
{
return $this->queue->delayedSize(...func_get_args());
}
/**
* Get the number of reserved jobs.
*
* @param string|null $queue
* @return int
*/
public function reservedSize($queue = null)
{
return $this->queue->reservedSize(...func_get_args());
}
/**
* Get the creation timestamp of the oldest pending job, excluding delayed jobs.
*
* @param string|null $queue
* @return int|null
*/
public function creationTimeOfOldestPendingJob($queue = null)
{
return $this->queue->creationTimeOfOldestPendingJob(...func_get_args());
}
/**
* Push a new job onto the queue.
*
* @param string|object $job
* @param mixed $data
* @param string|null $queue
* @return mixed
*/
public function push($job, $data = '', $queue = null)
{
return $this->queue->push(...func_get_args());
}
/**
* Push a new job onto the queue.
*
* @param string $queue
* @param string|object $job
* @param mixed $data
* @return mixed
*/
public function pushOn($queue, $job, $data = '')
{
return $this->queue->pushOn(...func_get_args());
}
/**
* Push a raw payload onto the queue.
*
* @param string $payload
* @param string|null $queue
* @return mixed
*/
public function pushRaw($payload, $queue = null, array $options = [])
{
$result = $this->queue->pushRaw(...func_get_args());
$this->finishQueueingJob($queue);
return $result;
}
/**
* Push a new job onto the queue after (n) seconds.
*
* @param DateTimeInterface|DateInterval|int $delay
* @param string|object $job
* @param mixed $data
* @param string|null $queue
* @return mixed
*/
public function later($delay, $job, $data = '', $queue = null)
{
return $this->queue->later(...func_get_args());
}
/**
* Push a new job onto a specific queue after (n) seconds.
*
* @param string $queue
* @param DateTimeInterface|DateInterval|int $delay
* @param string|object $job
* @param mixed $data
* @return mixed
*/
public function laterOn($queue, $delay, $job, $data = '')
{
return $this->queue->laterOn(...func_get_args());
}
/**
* Push an array of jobs onto the queue.
*
* @param array $jobs
* @param mixed $data
* @param string|null $queue
* @return mixed
*/
public function bulk($jobs, $data = '', $queue = null)
{
return $this->queue->bulk(...func_get_args());
}
/**
* Pop the next job off of the queue.
*
* @param string|null $queue
* @return IlluminateContractsQueueJob|null
*/
public function pop($queue = null)
{
$this->finishProcessingJob();
$job = $this->queue->pop(...func_get_args());
$this->startProcessingJob($queue, $job);
return $job;
}
/**
* Delete all of the jobs from the queue.
*
* @param string $queue
* @return int
*/
public function clear($queue)
{
return $this->queue->clear(...func_get_args());
}
/**
* Get the connection name for the queue.
*
* @return string
*/
public function getConnectionName()
{
return $this->queue->getConnectionName();
}
/**
* Set the connection name for the queue.
*
* @param string $name
* @return $this
*/
public function setConnectionName($name)
{
$this->queue->setConnectionName(...func_get_args());
return $this;
}
/**
* Set the queue configuration array.
*
* @param array $config
* @return $this
*/
public function setConfig($config)
{
$this->config = $config;
$this->queue->setConfig($config['connection']);
return $this;
}
/**
* Get the queueable options from the job.
*
* @param mixed $job
* @param string|null $queue
* @param string $payload
* @param DateTimeInterface|DateInterval|int|null $delay
* @return array{DelaySeconds?: int, MessageGroupId?: string, MessageDeduplicationId?: string}
*/
public function getQueueableOptions($job, $queue, $payload, $delay = null): array
{
if (! method_exists($this->queue, 'getQueueableOptions')) {
return [];
}
return $this->queue->getQueueableOptions(...func_get_args());
}
/**
* Finish processing the current job and emit a queue event.
*
* @param string $default
* @param CarbonCarbonImmutable|null $timestamp
* @return void
*/
public function finishProcessingJob($default = 'processed', $timestamp = null)
{
if (! $this->processingJob) {
return;
}
$timestamp ??= CarbonImmutable::now('UTC');
$this->events->emit([
'_cloud_event' => 'queue',
'timestamp' => $timestamp->toDateTimeString('microsecond'),
'type' => match (true) {
$this->processingJob->hasFailed() => 'failed',
$this->processingJob->isReleased() => 'released',
default => $default,
},
'queue' => $this->processingQueue,
'duration_ms' => (int) $this->processingJobStartedAt->diffInMilliseconds($timestamp),
]);
$this->processingQueue
= $this->processingJob
= $this->processingJobStartedAt
= null;
}
/**
* Last job details resolver.
*
* @return array{queue: string, attempts: int, started_at: CarbonImmutable}
*/
public function processingJobDetails()
{
return [
'queue' => $this->processingQueue,
'attempts' => $this->processingJob->attempts(),
'started_at' => $this->processingJobStartedAt,
];
}
/**
* Handle jobs finishing being queued.
*
* @param string $queue
*/
public function finishQueueingJob($queue)
{
$this->events->emit([
'_cloud_event' => 'queue',
'timestamp' => CarbonImmutable::now('UTC')->toDateTimeString('microsecond'),
'type' => 'queued',
'queue' => $this->normalizeQueue($queue),
]);
}
/**
* Handle a job being popped.
*
* @param string|null $queue
* @param IlluminateContractsQueueJob|null $job
* @return void
*/
protected function startProcessingJob($queue, $job)
{
if (! $job) {
return;
}
$this->processingJob = $job;
$this->processingQueue = $this->normalizeQueue($queue);
$this->processingJobStartedAt = CarbonImmutable::now('UTC');
$this->events->emit([
'_cloud_event' => 'queue',
'timestamp' => $this->processingJobStartedAt->toDateTimeString('microsecond'),
'type' => 'started',
'queue' => $this->processingQueue,
]);
}
/**
* Normalize the queue name.
*
* @param string|null $queue
* @return string
*/
public function normalizeQueue($queue)
{
$prefix = $this->config['connection']['prefix'] ?? null;
$suffix = $this->config['connection']['suffix'] ?? null;
return Str::of($this->queue->getQueue($queue))
->when($prefix, fn ($str) => $str->chopStart($prefix.'/'))
->when($suffix, fn ($str) => $str->endsWith('.fifo')
? $str->chopEnd('.fifo')->chopEnd($suffix)->append('.fifo')
: $str->chopEnd($suffix))
->toString();
}
/**
* Dynamically pass method calls to the underlying queue.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
return $this->forwardDecoratedCallTo($this->queue, $method, $parameters);
}
}