确定是否已使用dispatchNow调度作业

问题描述 投票:1回答:1

我有一份工作,在某些情况下称另一份工作

<?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);
        }

    }
}

这可能吗?

php laravel jobs
1个回答
0
投票

经过一番摸索,我能够回答自己的问题。对的,这是可能的;如果通过dispatchNow()调度作业,则Queueable对象的job属性为null,而如果使用dispatch()在连接上调度该作业,则将其设置为Illuminate \ Contracts \ Queue \ Job的实现。因此可以这样更改handle方法:

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.