【问题标题】:Check queue return status检查队列返回状态
【发布时间】:2019-07-07 12:47:03
【问题描述】:

我正在使用 Laravel 4.2 队列功能。现在我有一个函数将对数据进行处理,然后将一些结果返回给函数。我的问题是,如何检查从队列返回的状态?

代码

控制器功能

public function destroy($id, $message = '')
    {
        //Calling queue
        Queue::push('InvoiceQueue@delete_invoice', [
            'id' => $id,
            'Class' => $this->Class,

        ]);
        //continue the function after returned from the queue 

        //Do validation based on queue returned status
        $instance = $this->Class;
        $record = $instance::findOrFail($id);

        //Restore the DB if queue returned an error
        if ($record->restore()) {

        }

        //Delete the DB if queue process working fine
        else {

        return parent::destroy($id, trans("$this->class.invoice"));
     }
    }

队列功能

public function delete_invoice($job, $data)
    {
        try {
            return DB::transaction(function ()use ($job,$data) {

            //Doing some process here, go to Catch if an error

            });
        } catch (TransactionException $e) {

            return Response::json(['errors' => array_flatten($e->getErrors())], 400);
        }
    }

我不确定如何根据队列返回的结果在控制器函数中进行验证。上面的代码总是执行restore(),从不去else语句。

【问题讨论】:

  • 委托队列的全部意义在于在当前上下文之外执行该代码,因此您的代码不必等待队列作业完成。这意味着该作业无法返回任何结果。如果您依赖特定代码段的结果来继续您的控制器操作,那么您应该直接调用该方法/函数而不将其推送到队列中。

标签: php laravel laravel-4


【解决方案1】:

您对队列的使用不在这里。

队列只是可以运行任务,你可以将它们的结果存储到任何时候(比如 DB 或 LogFiles ,Redis ...)

队列的正确用法是用于代码

您不想通过您的主要代码(当前)运行它们,因为您无法直接访问队列结果(考虑到您的队列可能在当时停止(对于一些错误修复实施) 或者您的作业只会在午夜运行,这取决于您的业务逻辑)

或者

您正在使用外部服务(例如:发送电子邮件, 发送通知...),结果对您来说并不重要 当前代码

或者

您想在主进程之前回答外部请求

这里有队列以确保:

如果需要一整天的时间重试,他们将执行您请求的过程(例如发送电子邮件),以 去做(发送那封电子邮件)

或者您可以简单地将它们标记为失败的作业(由于在特定次数的重试后网络或代码问题的 bcs 失败)将它们存储在某个地方,并在修复错误后重试它们任何方式,他们不会丢失任何数据,除非他们从结果中得到正确的结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2019-12-31
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多