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

时间:2015-01-11 14:54:21

标签: php laravel task-queue beanstalkd laravel-5

我需要检查添加到队列(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;
}

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

3 个答案:

答案 0 :(得分:1)

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

从我的观点来看,似乎你只是颠倒了观点。而不是寻找失败的东西,你正在寻找有用的东西。

Source

答案 1 :(得分:0)

我还没有使用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是否存在。

答案 2 :(得分:0)

如果您需要根据作业完成触发命令 - 那么听起来您应该在作业完成时触发排队命令 - 那么您的系统可以处理剩下的工作吗?

否则'投票'对于工作来说,看它是否/什么时候完成似乎很麻烦和低效。

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