我需要检查添加到队列(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;
}
问题是 - 是否可靠的方法来检查工作是否已完成?我在这里比较我从异常中得到的消息。我还没有找到任何其他方法来检查工作是否已经完成。
答案 0 :(得分:1)
我还没有使用Laravel 5,但是在Laravel 4上,你有失败的作业表。在哪里可以看到哪些工作没有完成。我假设L5可能有某些东西或保持相同的过程。这不会解决你的问题?
从我的观点来看,似乎你只是颠倒了观点。而不是寻找失败的东西,你正在寻找有用的东西。
答案 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
实现 - 因此命令排队等待其他任务完成时运行。