我有一份工作,在某些情况下称另一份工作
<?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);
}
}
}
这可能吗?
经过一番摸索,我能够回答自己的问题。对的,这是可能的;如果通过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();
}