【问题标题】:Laravel Job Queue Dispatch Now not failing like normalLaravel 作业队列调度现在不会像往常一样失败
【发布时间】:2020-01-03 12:52:50
【问题描述】:

我的工作是测试失败是如何发生的:

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

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

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

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

因为目前看来,我唯一的方法是:

    $fakeJob = new FakeJob($apiUser);
    try {
        $fakeJob->handle();
    } catch(Exception $e) {
        $fakeJob->failed($e);
    }

我想这……很好,但并不理想。

【问题讨论】:

    标签: php laravel queue


    【解决方案1】:

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

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

    FakeJob::dispatch($apiUser)->onConnection('sync');
    

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

    【讨论】:

    • 我没想过要那样做!
    • 我现在试试这个并报告
    • 啊,这确实有效!作为记录,如果任务出错,它会转到 failed 方法,但是 -&gt;dispatch() 调用错误也一样,它没有捕获它,所以如果你不想要,你必须尝试捕获你发布的代码它在那里出错。
    【解决方案2】:

    一个新的 dispatchSync() 方法将在未来几个月发布时在 Laravel 8.0 中提供。
    就像@Keshari 的answer 建议的那样,它将在同步队列上调度作业。

    文档:https://laravel.com/docs/master/queues#synchronous-dispatching
    提交:https://github.com/laravel/framework/commit/0b3ed6859046258fba2e0ab3340bdab33e4c82bd

    【讨论】:

      【解决方案3】:

      查看 Laravel 代码库(和文档),dispatchNow() 方法在不与任何队列交互的情况下同步执行作业。

      https://laravel.com/docs/5.8/queues#synchronous-dispatching

      本质上,它只会在您的工作中调用handle() 方法,仅此而已。

      你对 try/catch 块所做的可能是目前最好的解决方案,但值得向 Laravel 团队提出这个功能请求。

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 2020-11-04
        • 2018-08-16
        • 1970-01-01
        • 2019-07-10
        • 2021-02-26
        • 2021-08-06
        • 1970-01-01
        • 2015-09-27
        相关资源
        最近更新 更多