Обнаружение, если задание было отправлено, используя dispatchNow - PullRequest
1 голос
/ 17 апреля 2020

У меня есть задание, которое при определенных обстоятельствах вызывает другое задание

<?php namespace App\Jobs;

use App\Models\Account;

class EnqueueScheduledDownloads implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $account;

    public function __construct(Account $account)
    {
        $this->account = $account;
    }

    public function handle()
    {
        foreach($this->account->pending_downloads as $file)
        {
            DownloadFile::dispatch($file);
        }
    }
}

Пока задание на загрузку обычно выполняется в очереди; например, во время тестирования бывает, что моя жизнь будет намного проще, если вся цепочка будет обрабатываться синхронно блокирующим образом. Я хотел бы иметь возможность сделать что-то вроде этого:

public function handle()
{
    foreach($this->account->pending_downloads as $file)
    {
        if($this->getDispatchMode() == 'sync') {
            DownloadFile::dispatchNow($file);
        } else {
            DownloadFile::dispatch($file);
        }

    }
}

Возможно ли это?

1 Ответ

0 голосов
/ 18 апреля 2020

После небольшого возни я смог ответить на свой вопрос. Да, это возможно; если задание отправляется через dispatchNow(), свойство job объекта Queueable будет иметь значение null, тогда как если оно отправляется по соединению с использованием dispatch(), для него устанавливается реализация Illuminate \ Contracts \ Queue \ Job. Таким образом, метод дескриптора может быть изменен следующим образом:

public function handle()
{
    foreach($this->account->pending_downloads as $file)
    {
        if(is_null($this->job)) {
            DownloadFile::dispatchNow($file);
        } else {
            DownloadFile::dispatch($file);
        }
    }
}

И он будет работать как положено. Мне удалось найти это решение, создав новое задание:

<?php namespace App\Jobs;

class TestJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
    }

    public function handle()
    {
        dump(get_object_vars($this));
    }
}

и отправив его в различные очереди и соединения, а также с помощью dispatchNow() и наблюдая за выводом. Кроме того, можно восстановить соединение и поставить в очередь задание, отправленное с $this->job:

public function handle()
{
    echo $this->job->getConnectionName();
    echo $this->job->getQueue();
}
...