Вход Регистрация
Файл: 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 QueueContractClearableQueue
{
    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($prefixfn ($str) => $str->chopStart($prefix.'/'))
            ->
when($suffixfn ($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);
    }
}
Онлайн: 1
Реклама