Commaaa2
This commit is contained in:
140
vendor/laravel/framework/src/Illuminate/Queue/Queue.php
vendored
Normal file → Executable file
140
vendor/laravel/framework/src/Illuminate/Queue/Queue.php
vendored
Normal file → Executable file
@@ -5,6 +5,10 @@ namespace Illuminate\Queue;
|
||||
use Closure;
|
||||
use DateTimeInterface;
|
||||
use Illuminate\Container\Container;
|
||||
use Illuminate\Contracts\Encryption\Encrypter;
|
||||
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
|
||||
use Illuminate\Queue\Events\JobQueued;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\InteractsWithTime;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
@@ -26,6 +30,13 @@ abstract class Queue
|
||||
*/
|
||||
protected $connectionName;
|
||||
|
||||
/**
|
||||
* Indicates that jobs should be dispatched after all database transactions have committed.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
protected $dispatchAfterCommit;
|
||||
|
||||
/**
|
||||
* The create payload callbacks.
|
||||
*
|
||||
@@ -91,7 +102,7 @@ abstract class Queue
|
||||
$job = CallQueuedClosure::create($job);
|
||||
}
|
||||
|
||||
$payload = json_encode($this->createPayloadArray($job, $queue, $data));
|
||||
$payload = json_encode($this->createPayloadArray($job, $queue, $data), \JSON_UNESCAPED_UNICODE);
|
||||
|
||||
if (JSON_ERROR_NONE !== json_last_error()) {
|
||||
throw new InvalidPayloadException(
|
||||
@@ -132,20 +143,25 @@ abstract class Queue
|
||||
'job' => 'Illuminate\Queue\CallQueuedHandler@call',
|
||||
'maxTries' => $job->tries ?? null,
|
||||
'maxExceptions' => $job->maxExceptions ?? null,
|
||||
'delay' => $this->getJobRetryDelay($job),
|
||||
'failOnTimeout' => $job->failOnTimeout ?? false,
|
||||
'backoff' => $this->getJobBackoff($job),
|
||||
'timeout' => $job->timeout ?? null,
|
||||
'timeoutAt' => $this->getJobExpiration($job),
|
||||
'retryUntil' => $this->getJobExpiration($job),
|
||||
'data' => [
|
||||
'commandName' => $job,
|
||||
'command' => $job,
|
||||
],
|
||||
]);
|
||||
|
||||
$command = $this->jobShouldBeEncrypted($job) && $this->container->bound(Encrypter::class)
|
||||
? $this->container[Encrypter::class]->encrypt(serialize(clone $job))
|
||||
: serialize(clone $job);
|
||||
|
||||
return array_merge($payload, [
|
||||
'data' => [
|
||||
'data' => array_merge($payload['data'], [
|
||||
'commandName' => get_class($job),
|
||||
'command' => serialize(clone $job),
|
||||
],
|
||||
'command' => $command,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -162,21 +178,26 @@ abstract class Queue
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the retry delay for an object-based queue handler.
|
||||
* Get the backoff for an object-based queue handler.
|
||||
*
|
||||
* @param mixed $job
|
||||
* @return mixed
|
||||
*/
|
||||
public function getJobRetryDelay($job)
|
||||
public function getJobBackoff($job)
|
||||
{
|
||||
if (! method_exists($job, 'retryAfter') && ! isset($job->retryAfter)) {
|
||||
if (! method_exists($job, 'backoff') && ! isset($job->backoff)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$delay = $job->retryAfter ?? $job->retryAfter();
|
||||
if (is_null($backoff = $job->backoff ?? $job->backoff())) {
|
||||
return;
|
||||
}
|
||||
|
||||
return $delay instanceof DateTimeInterface
|
||||
? $this->secondsUntil($delay) : $delay;
|
||||
return collect(Arr::wrap($backoff))
|
||||
->map(function ($backoff) {
|
||||
return $backoff instanceof DateTimeInterface
|
||||
? $this->secondsUntil($backoff) : $backoff;
|
||||
})->implode(',');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,16 +208,31 @@ abstract class Queue
|
||||
*/
|
||||
public function getJobExpiration($job)
|
||||
{
|
||||
if (! method_exists($job, 'retryUntil') && ! isset($job->timeoutAt)) {
|
||||
if (! method_exists($job, 'retryUntil') && ! isset($job->retryUntil)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$expiration = $job->timeoutAt ?? $job->retryUntil();
|
||||
$expiration = $job->retryUntil ?? $job->retryUntil();
|
||||
|
||||
return $expiration instanceof DateTimeInterface
|
||||
? $expiration->getTimestamp() : $expiration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the job should be encrypted.
|
||||
*
|
||||
* @param object $job
|
||||
* @return bool
|
||||
*/
|
||||
protected function jobShouldBeEncrypted($job)
|
||||
{
|
||||
if ($job instanceof ShouldBeEncrypted) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return isset($job->shouldBeEncrypted) && $job->shouldBeEncrypted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a typical, string based queue payload array.
|
||||
*
|
||||
@@ -213,7 +249,8 @@ abstract class Queue
|
||||
'job' => $job,
|
||||
'maxTries' => null,
|
||||
'maxExceptions' => null,
|
||||
'delay' => null,
|
||||
'failOnTimeout' => false,
|
||||
'backoff' => null,
|
||||
'timeout' => null,
|
||||
'data' => $data,
|
||||
]);
|
||||
@@ -222,7 +259,7 @@ abstract class Queue
|
||||
/**
|
||||
* Register a callback to be executed when creating job payloads.
|
||||
*
|
||||
* @param callable $callback
|
||||
* @param callable|null $callback
|
||||
* @return void
|
||||
*/
|
||||
public static function createPayloadUsing($callback)
|
||||
@@ -254,6 +291,67 @@ abstract class Queue
|
||||
return $payload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue a job using the given callback.
|
||||
*
|
||||
* @param \Closure|string|object $job
|
||||
* @param string $payload
|
||||
* @param string $queue
|
||||
* @param \DateTimeInterface|\DateInterval|int|null $delay
|
||||
* @param callable $callback
|
||||
* @return mixed
|
||||
*/
|
||||
protected function enqueueUsing($job, $payload, $queue, $delay, $callback)
|
||||
{
|
||||
if ($this->shouldDispatchAfterCommit($job) &&
|
||||
$this->container->bound('db.transactions')) {
|
||||
return $this->container->make('db.transactions')->addCallback(
|
||||
function () use ($payload, $queue, $delay, $callback, $job) {
|
||||
return tap($callback($payload, $queue, $delay), function ($jobId) use ($job) {
|
||||
$this->raiseJobQueuedEvent($jobId, $job);
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
return tap($callback($payload, $queue, $delay), function ($jobId) use ($job) {
|
||||
$this->raiseJobQueuedEvent($jobId, $job);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the job should be dispatched after all database transactions have committed.
|
||||
*
|
||||
* @param \Closure|string|object $job
|
||||
* @return bool
|
||||
*/
|
||||
protected function shouldDispatchAfterCommit($job)
|
||||
{
|
||||
if (is_object($job) && isset($job->afterCommit)) {
|
||||
return $job->afterCommit;
|
||||
}
|
||||
|
||||
if (isset($this->dispatchAfterCommit)) {
|
||||
return $this->dispatchAfterCommit;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Raise the job queued event.
|
||||
*
|
||||
* @param string|int|null $jobId
|
||||
* @param \Closure|string|object $job
|
||||
* @return void
|
||||
*/
|
||||
protected function raiseJobQueuedEvent($jobId, $job)
|
||||
{
|
||||
if ($this->container->bound('events')) {
|
||||
$this->container['events']->dispatch(new JobQueued($this->connectionName, $jobId, $job));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the connection name for the queue.
|
||||
*
|
||||
@@ -277,6 +375,16 @@ abstract class Queue
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the container instance being used by the connection.
|
||||
*
|
||||
* @return \Illuminate\Container\Container
|
||||
*/
|
||||
public function getContainer()
|
||||
{
|
||||
return $this->container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the IoC container instance.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user