如何检查 Beanstalkd 队列中的作业是否已在 Laravel 中完成


How to check if job in in Beanstalkd queue has been completed in Laravel

我需要检查添加到队列(Beanstalkd)的作业是否已在Laravel(Laravel 5)中完成,如果完成,我需要返回更新的记录(任务添加到数据库中的队列更新记录)。我已经添加到我的composer.json

"pda/pheanstalk": "3.*"

我以这种方式将作业添加到队列中:

$jobId = Queue::push('App'Class', $object->toArray(), $this->getQueueName());

我用来检查作业是否完成使用以下功能:

public function find($queueName, $jobId, $recordId)
{
    $phean = Queue::getPheanstalk();
    try {
        $phean->peek($jobId);
        $data = ['status' => 'waiting'];
    } catch (ServerException $e) {
        $message = $e->getMessage();
        if ($message == 'NOT_FOUND: Job ' . $jobId . ' does not exist.') {
            $data = ... // here I get from database data for $recordId
        } else {
            $data = ['status' => 'error'];
        }
    }
    return $data;
}

问题是 - 这是检查工作是否已完成的可靠方法吗?我在这里比较只是我从异常中得到的消息。我没有找到任何其他方法来检查工作是否已完成。

我还没有使用过 Laravel 5,但在 Laravel 4 上,你有失败的作业表。在哪里可以看到哪些作业未完成。我假设 L5 可能有一些东西或保持相同的过程。这不能解决你的问题吗?

从我的角度来看,你似乎只是在颠倒观点。你不是在寻找失败的东西,而是在寻找有效的方法。

我还没有使用 Laravel 5。但是对于Laravel 4,当作业完成时,需要从队列中手动将其删除。以下是官方文档:

Deleting A Processed Job: Once you have processed a job, it must be deleted from the queue, which can be done via the delete method on the Job instance

这只是意味着,如果您没有使用这种方法,作业状态将保持未完成状态。在您的情况下,您可以获取队列并查看作业 ID 是否存在。

如果您需要根据

作业完成触发命令 - 那么听起来您应该在作业完成时触发排队的命令 - 那么您的系统可以处理其余的吗?

否则,对作业进行"轮询"以查看是否/何时完成似乎很麻烦且效率低下。

在 Laravel 5 中 - 您可以使用 Taylor 提供的新命令工具,并应用ShouldBeQueued实现 - 因此命令将排队等待在完成其他任务时运行。