我需要检查添加到队列(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
实现 - 因此命令将排队等待在完成其他任务时运行。