我以前从未建立过排队系统。我决定试一试。排队系统似乎运行得很好。但是,似乎没有正确发送数据。这是我的代码。
...
$comment = new Comment(Input::all());
$comment->user_id = $user->id;
$comment->save();
if ($comment->isSaved())
{
$voters = $comment->argument->voters->unique()->toArray();
Queue::push('Queues\NewComment',
[
'comment' => $comment->load('argument', 'user')->toArray(),
'voters' => $voters
]
);
return Response::json(['success' => true, 'comment' => $comment->load('user')->toArray()]);
}
...
处理此问题的类看起来像这样:
class NewComment {
public function fire($job, $data)
{
$comment = $data['comment'];
$voters = $data['voters'];
Log::info($data);
foreach ($voters as $voter)
{
if ($voter['id'] != $comment['user_id'])
{
$mailer = new NewCommentMailer($voter, $comment);
$mailer->send();
}
}
$job->delete();
}
}
使用同步队列驱动程序在我的本地服务器上运行良好。但是,在我的生产服务器上,我正在使用Beanstalkd。队列正在按照预期发射。但是,我收到这样的错误:
[2013-12-19 10:25:02] production.ERROR: exception 'ErrorException' with message 'Undefined index: voters' in /var/www/mywebsite/app/queues/NewComment.php:10
如果我打印出传递到$data
队列处理程序的NewComment
变量,我会得到这个:
[2013-12-19 10:28:05] production.INFO: {"comment":{"incrementing":true,"timestamps":true,"exists":true}} [] []
我不知道为什么会这样。任何人都知道如何解决这个问题。
答案 0 :(得分:0)
所以美元选民显然没有作为有效载荷的一部分被列入队列。我将在Queue :: push()函数之外构建有效负载数组,记录内容,并准确查看所放入的内容。
我发现如果你没有得到你想要的东西,很可能,它不像你期望的那样被放入。
当你在它的时候,确保beanstalkd系统没有旧数据卡在其中是不正确的。您可以在有效负载中添加时间戳,以帮助确保它是最新数据,并安排删除或掩埋任何没有相应信息的作业 - 在开始处理之前进行检查。只要查看豆秆管中的物品数量,就应该明白是否存在卡住的工作。
我没有对Laravel做过任何事情,但是我为其他Beanstalkd和SQS支持的系统编写了许多任务,而困难的部分是当作业失败时,你必须弄清楚出了什么问题,以及如何避免一遍又一遍地重做同样的失败。
答案 1 :(得分:0)
我最终做的是坚持使用简单的数字。我只将注释的ID存储在队列中,然后在队列处理程序类中完成所有处理。这是最简单的方法。
答案 2 :(得分:0)
通过将数据包装在数组中,您将在处理程序中获得预期的数据:
array(
array('comment' => $comment->load('argument', 'user')->toArray(),
'voters' => $voters
)
)