Laravel 作业队列调度现在不会像往常一样失败

TKo*_*KoL 4 php queue laravel

我有一份工作是为了测试失败是如何工作的:

<?php

namespace App\Jobs;

use App\ApiUser;
use App\Helpers\Helper;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

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

    private $apiUser;

    public function __construct(ApiUser $apiUser) {
        $this->apiUser = $apiUser;
    }

    public function handle() {
        throw new Exception('time is even');
    }

    public function failed(Exception $exception) {
        // Send user notification of failure, etc...
        $path = storage_path('logs/s3_logs/FakeJob_failed_' . Helper::generateRandomString(5) . '.txt');
        file_put_contents($path, $exception->getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我正常调度时,它会转到failed函数并完全按预期写入文件。

但是,当我这样做时FakeJob::dispatchNow($apiUser);,它根本不会这样做......

有没有办法dispatchNow在与请求相同的进程上运行,但失败,就像它正常排队一样?

因为目前,看起来我唯一的方法是执行以下操作:

    $fakeJob = new FakeJob($apiUser);
    try {
        $fakeJob->handle();
    } catch(Exception $e) {
        $fakeJob->failed($e);
    }
Run Code Online (Sandbox Code Playgroud)

这是...很好,我想,但并不理想。

小智 7

如果我没看错,dispatchNow()用于同步运行作业,但不幸的是,它没有调用失败的方法。

如果您希望在作业失败时调用失败的方法,则可以使用以下代码。

FakeJob::dispatch($apiUser)->onConnection('sync');
Run Code Online (Sandbox Code Playgroud)

它将同步运行作业并执行失败的方法。