Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Queue/Middleware/WithoutOverlapping.php
Строк: 104
<?php

namespace IlluminateQueueMiddleware;

use 
IlluminateContainerContainer;
use 
IlluminateContractsCacheRepository as Cache;
use 
IlluminateSupportInteractsWithTime;

class 
WithoutOverlapping
{
    use 
InteractsWithTime;

    
/**
     * The job's unique key used for preventing overlaps.
     *
     * @var string
     */
    
public $key;

    
/**
     * The number of seconds before a job should be available again if no lock was acquired.
     *
     * @var DateTimeInterface|int|null
     */
    
public $releaseAfter;

    
/**
     * The number of seconds before the lock should expire.
     *
     * @var int
     */
    
public $expiresAfter;

    
/**
     * The prefix of the lock key.
     *
     * @var string
     */
    
public $prefix 'laravel-queue-overlap:';

    
/**
     * Share the key across different jobs.
     *
     * @var bool
     */
    
public $shareKey false;

    
/**
     * Create a new middleware instance.
     *
     * @param  string  $key
     * @param  DateTimeInterface|int|null  $releaseAfter
     * @param  DateTimeInterface|int  $expiresAfter
     * @return void
     */
    
public function __construct($key ''$releaseAfter 0$expiresAfter 0)
    {
        
$this->key $key;
        
$this->releaseAfter $releaseAfter;
        
$this->expiresAfter $this->secondsUntil($expiresAfter);
    }

    
/**
     * Process the job.
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    
public function handle($job$next)
    {
        
$lock Container::getInstance()->make(Cache::class)->lock(
            
$this->getLockKey($job), $this->expiresAfter
        
);

        if (
$lock->get()) {
            try {
                
$next($job);
            } finally {
                
$lock->release();
            }
        } elseif (! 
is_null($this->releaseAfter)) {
            
$job->release($this->releaseAfter);
        }
    }

    
/**
     * Set the delay (in seconds) to release the job back to the queue.
     *
     * @param  DateTimeInterface|int  $releaseAfter
     * @return $this
     */
    
public function releaseAfter($releaseAfter)
    {
        
$this->releaseAfter $releaseAfter;

        return 
$this;
    }

    
/**
     * Do not release the job back to the queue if no lock can be acquired.
     *
     * @return $this
     */
    
public function dontRelease()
    {
        
$this->releaseAfter null;

        return 
$this;
    }

    
/**
     * Set the maximum number of seconds that can elapse before the lock is released.
     *
     * @param  DateTimeInterface|DateInterval|int  $expiresAfter
     * @return $this
     */
    
public function expireAfter($expiresAfter)
    {
        
$this->expiresAfter $this->secondsUntil($expiresAfter);

        return 
$this;
    }

    
/**
     * Set the prefix of the lock key.
     *
     * @param  string  $prefix
     * @return $this
     */
    
public function withPrefix(string $prefix)
    {
        
$this->prefix $prefix;

        return 
$this;
    }

    
/**
     * Indicate that the lock key should be shared across job classes.
     *
     * @return $this
     */
    
public function shared()
    {
        
$this->shareKey true;

        return 
$this;
    }

    
/**
     * Get the lock key for the given job.
     *
     * @param  mixed  $job
     * @return string
     */
    
public function getLockKey($job)
    {
        return 
$this->shareKey
            
$this->prefix.$this->key
            
$this->prefix.get_class($job).':'.$this->key;
    }
}
Онлайн: 1
Реклама