Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Foundation/Cloud/QueueConnector.php
Строк: 200
<?php

namespace IlluminateFoundationCloud;

use 
AwsCommandInterface;
use 
AwsExceptionAwsException;
use 
AwsSqsSqsClient;
use 
IlluminateFoundationApplication;
use 
IlluminateQueueConnectorsConnectorInterface;
use 
IlluminateQueueEventsJobQueued;
use 
IlluminateQueueEventsWorkerStopping;
use 
IlluminateQueueSqsQueue;
use 
IlluminateQueueWorker;
use 
IlluminateQueueWorkerStopReason;
use 
PsrHttpMessageRequestInterface;

class 
QueueConnector implements ConnectorInterface
{
    
/**
     * Reserved memory so that errors can emit events correctly on memory exhaustion.
     */
    
private static ?string $reservedMemory null;

    
/**
     * Create a new instance.
     */
    
public function __construct(
        protected 
ConnectorInterface $connector,
        protected 
Application $app,
    ) {
        
//
    
}

    
/**
     * Establish a queue connection.
     */
    
public function connect(array $config): Queue
    
{
        
$underlying $this->connector->connect($config['connection']);

        
$queue = new Queue(
            
$underlying,
            
$this->app[Events::class],
            
$config,
        );

        if (
$underlying instanceof SqsQueue) {
            
$this->registerErrorHandling($underlying->getSqs(), $queue);
        }

        
$this->configureQueue($queue);

        if (! 
$this->app->runningConsoleCommand('queue:work')) {
            return 
$queue;
        }

        
$this->configureWorker($queue);
        
$this->configureFailedJobProvider($queue);

        return 
$queue;
    }

    
/**
     * Register SQS client middleware that translates "queue does not exist" errors into ManagedQueueNotFoundExceptions.
     */
    
protected function registerErrorHandling(SqsClient $sqsQueue $queue): void
    
{
        
$sqs->getHandlerList()->appendSign(function (callable $handler) use ($queue) {
            return function (
CommandInterface $commandRequestInterface $request) use ($handler$queue) {
                return 
$handler($command$request)->otherwise(function ($reason) use ($command$queue) {
                    if (
$reason instanceof AwsException &&
                        
$reason->getAwsErrorCode() === 'AWS.SimpleQueueService.NonExistentQueue') {
                        
$name $queue->normalizeQueue($command['QueueUrl'] ?? null);

                        throw new 
ManagedQueueNotFoundException(
                            
"Managed queue [{$name}] does not exist."0$reason,
                        );
                    }

                    throw 
$reason;
                });
            };
        }, 
'managed-queue-not-found');
    }

    
/**
     * Configure the queue.
     */
    
protected function configureQueue(Queue $queue): void
    
{
        
$this->app['events']->listen(fn (JobQueued $event) => $event->connectionName === $queue->getConnectionName()
            ? 
$queue->finishQueueingJob($event->queue)
            : 
null);
    }

    
/**
     * Configure the queue worker.
     */
    
protected function configureWorker(Queue $queue): void
    
{
        
Worker::$restartable false;
        
Worker::$pausable false;

        
$this->app['events']->listen(fn (WorkerStopping $event) => match ($event->reason) {
            
WorkerStopReason::TimedOut => $queue->finishProcessingJob(default: 'released'),
            default => 
$queue->finishProcessingJob(),
        });

        static::
$reservedMemory str_repeat('x'32768);

        
register_shutdown_function(function () use ($queue) {
            static::
$reservedMemory null;

            if (! 
is_null($error error_get_last()) && in_array($error['type'], [E_COMPILE_ERRORE_CORE_ERRORE_ERRORE_PARSE])) {
                
$queue->finishProcessingJob(default: 'released');
            }
        });
    }

    
/**
     * Configure the failed job provider.
     */
    
protected function configureFailedJobProvider(Queue $queue): void
    
{
        
$this->app['queue.failer']->setQueue($queue);
    }
}
Онлайн: 1
Реклама